Class that helps to parallelize loops. More...
#include <ParallelLoop.h>
Classes | |
struct | TaskInfo |
Signals | |
void | finished () |
void | progressChanged (int processIndex, int progress) |
void | progressInit (int processIndex, int maximumValue) |
void | statusChanged (int processIndex, QString msg) |
Public Member Functions | |
ParallelLoop (QObject *parent=0) | |
void | start (int iStart, int iEnd, bool forceParallel=false) |
void | terminate () |
void | waitFinished () |
Protected Slots | |
virtual void | taskFinished () |
Protected Member Functions | |
virtual LoopTask * | newTask ()=0 |
Class that helps to parallelize loops.
QGpCoreTools::ParallelLoop::ParallelLoop | ( | QObject * | parent = 0 | ) | [inline] |
Initialize a loop. The parameters param will be provided as a pointer to each task.
: QObject(parent) {}
void QGpCoreTools::ParallelLoop::finished | ( | ) | [signal] |
Referenced by taskFinished().
virtual LoopTask* QGpCoreTools::ParallelLoop::newTask | ( | ) | [protected, pure virtual] |
Implemented in SPACLoop, LinearFKPassiveLoop, FKLoop, and HRFKLoop.
Referenced by start().
void QGpCoreTools::ParallelLoop::progressChanged | ( | int | processIndex, |
int | progress | ||
) | [signal] |
void QGpCoreTools::ParallelLoop::progressInit | ( | int | processIndex, |
int | maximumValue | ||
) | [signal] |
void QGpCoreTools::ParallelLoop::start | ( | int | iStart, |
int | iEnd, | ||
bool | forceParallel = false |
||
) |
Start loop from iStart to iEnd-1
References QGpCoreTools::Thread::idealThreadCount(), newTask(), QGpCoreTools::LoopTask::setIndex(), QGpCoreTools::Thread::start(), QGpCoreTools::Thread::startNoThread(), and TRACE.
Referenced by ToolLinearFKPassive::finishPositive(), ToolSPAC::startLoop(), and ToolFK::startLoop().
{ TRACE; int nThreads=Thread::idealThreadCount(); _index=iStart; LoopTask * t; TaskInfo infos; if(nThreads==1 && !forceParallel) { t=newTask(iEnd); infos.index=0; infos.maximumProgress=0; _tasks.insert(t, infos); t->startNoThread(); } else { for(int i=0; i<nThreads; i++) { t=newTask(iEnd); t->setObjectName("parallelLoop"); infos.index=i; infos.maximumProgress=0; _tasks.insert(t, infos); t->setIndex(&_index, &_indexMutex); t->start(); } } }
void QGpCoreTools::ParallelLoop::statusChanged | ( | int | processIndex, |
QString | msg | ||
) | [signal] |
void QGpCoreTools::ParallelLoop::taskFinished | ( | ) | [protected, virtual, slot] |
References finished(), QGpCoreTools::tr(), and TRACE.
{ TRACE; LoopTask * t=static_cast<LoopTask *>(sender()); QMap<LoopTask *,TaskInfo>::iterator it=_tasks.find(t); if(it!=_tasks.end()) { emit statusChanged(it.value().index, tr("Finished")); emit progressChanged(it.value().index, it.value().maximumProgress); _tasks.erase(it); delete t; if(_tasks.isEmpty()) emit finished(); } }
References TRACE.
Referenced by ToolFK::stop().
{ TRACE; for(QMap<LoopTask *,TaskInfo>::iterator it=_tasks.begin(); it!=_tasks.end(); it++) { if(!it.key()->terminated()) it.key()->terminate(); } }
References QGpCoreTools::App::sleep().
Referenced by ToolFK::waitFinished(), and ToolSPAC::waitFinished().
{ while(!_tasks.isEmpty()) { App::sleep(500); QCoreApplication::processEvents(); } }