Go to the documentation of this file. 40 #ifndef __OPENFLUID_WARE_THREADEDLOOPMACROS_HPP__ 41 #define __OPENFLUID_WARE_THREADEDLOOPMACROS_HPP__ 48 #if QT_VERSION >= QT_VERSION_CHECK(5,0,0) 49 #include <QtConcurrent> 52 #include <QtConcurrentRun> 53 #include <QFutureSynchronizer> 62 #define _THREADSYNCID(_id) _M_##_id##_Sync 65 #define _APPLY_UNITS_ORDERED_LOOP_THREADED_WITHID(id,unitsclass,funcptr,...) \ 66 openfluid::core::UnitsList_t* _UNITSLISTID(id) = mp_SpatialData->spatialUnits(unitsclass)->list(); \ 67 if (_UNITSLISTID(id) != nullptr) \ 69 openfluid::core::UnitsList_t::iterator _UNITSLISTITERID(id) = _UNITSLISTID(id)->begin(); \ 70 if (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end()) \ 72 openfluid::core::PcsOrd_t _PCSORDID(id) = _UNITSLISTITERID(id)->getProcessOrder(); \ 73 while (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end()) \ 75 QFutureSynchronizer<void> _THREADSYNCID(id); \ 76 while (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end() && \ 77 _UNITSLISTITERID(id)->getProcessOrder() == _PCSORDID(id)) \ 81 _THREADSYNCID(id).addFuture(QtConcurrent::run(std::bind(&funcptr,\ 83 &(*_UNITSLISTITERID(id)),## __VA_ARGS__)));\ 84 if (_THREADSYNCID(id).futures().size() == OPENFLUID_GetSimulatorMaxThreads())\ 86 _THREADSYNCID(id).waitForFinished(); \ 87 _THREADSYNCID(id).clearFutures(); \ 90 catch (QtConcurrent::UnhandledException& E) \ 92 throw openfluid::base::FrameworkException(OPENFLUID_CODE_LOCATION, \ 93 "QtConcurrent::UnhandledException in threaded loop"); \ 95 ++_UNITSLISTITERID(id); \ 97 _THREADSYNCID(id).waitForFinished(); \ 98 _THREADSYNCID(id).clearFutures(); \ 99 if (_UNITSLISTITERID(id) != _UNITSLISTID(id)->end()) _PCSORDID(id) = _UNITSLISTITERID(id)->getProcessOrder(); \ 110 #define APPLY_UNITS_ORDERED_LOOP_THREADED(unitsclass,funcptr,...) \ 111 _APPLY_UNITS_ORDERED_LOOP_THREADED_WITHID(__LINE__,unitsclass,funcptr,## __VA_ARGS__) 115 #define _APPLY_ALLUNITS_ORDERED_LOOP_THREADED_WITHID(id,funcptr,...) \ 116 openfluid::core::UnitsPtrList_t* _UNITSPTRLISTID(id) = mp_SpatialData->allSpatialUnits(); \ 117 if (_UNITSPTRLISTID(id) != nullptr) \ 119 openfluid::core::UnitsPtrList_t::iterator _UNITSPTRLISTITERID(id) = _UNITSPTRLISTID(id)->begin(); \ 120 if (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end()) \ 122 openfluid::core::PcsOrd_t _PCSORDID(id) = (*_UNITSPTRLISTITERID(id))->getProcessOrder(); \ 123 while (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end()) \ 125 QFutureSynchronizer<void> _THREADSYNCID(id); \ 126 while (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end() && \ 127 (*_UNITSPTRLISTITERID(id))->getProcessOrder() == _PCSORDID(id)) \ 131 _THREADSYNCID(id).addFuture(QtConcurrent::run(std::bind(&funcptr,\ 133 (*_UNITSPTRLISTITERID(id)),## __VA_ARGS__)));\ 134 if (_THREADSYNCID(id).futures().size() == OPENFLUID_GetSimulatorMaxThreads())\ 136 _THREADSYNCID(id).waitForFinished(); \ 137 _THREADSYNCID(id).clearFutures(); \ 140 catch(QtConcurrent::UnhandledException& E) \ 142 throw openfluid::base::FrameworkException(OPENFLUID_CODE_LOCATION, \ 143 "QtConcurrent::UnhandledException in threaded loop"); \ 145 ++_UNITSPTRLISTITERID(id); \ 147 _THREADSYNCID(id).waitForFinished(); \ 148 _THREADSYNCID(id).clearFutures(); \ 149 if (_UNITSPTRLISTITERID(id) != _UNITSPTRLISTID(id)->end())\ 150 _PCSORDID(id) = (*_UNITSPTRLISTITERID(id))->getProcessOrder(); \ 160 #define APPLY_ALLUNITS_ORDERED_LOOP_THREADED(funcptr,...) \ 161 _APPLY_ALLUNITS_ORDERED_LOOP_THREADED_WITHID(__LINE__,funcptr,## __VA_ARGS__)