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) != NULL) \
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) != NULL) \
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__)