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__)