void TaskQueue::wakeThread() { if (!_thread) { _thread = new QThread(); _worker = new TaskQueueWorker(this); _worker->moveToThread(_thread); connect(this, SIGNAL(taskAdded()), _worker, SLOT(onTaskAdded())); connect(_worker, SIGNAL(taskProcessed()), this, SLOT(onTaskProcessed())); _thread->start(); } if (_stopTimer) _stopTimer->stop(); emit taskAdded(); }
TaskId TaskQueue::addTask(TaskPtr task) { { QMutexLocker lock(&_tasksToProcessMutex); _tasksToProcess.push_back(task); } if (!_thread) { _thread = new QThread(); _worker = new TaskQueueWorker(this); _worker->moveToThread(_thread); connect(this, SIGNAL(taskAdded()), _worker, SLOT(onTaskAdded())); connect(_worker, SIGNAL(taskProcessed()), this, SLOT(onTaskProcessed())); _thread->start(); } if (_stopTimer) _stopTimer->stop(); emit taskAdded(); return task->id(); }
void TaskQueueWorker::onTaskAdded() { if (_inTaskAdded) return; _inTaskAdded = true; bool someTasksLeft = false; do { TaskPtr task; { QMutexLocker lock(&_queue->_tasksToProcessMutex); if (!_queue->_tasksToProcess.isEmpty()) { task = _queue->_tasksToProcess.front(); } } if (task) { task->process(); bool emitTaskProcessed = false; { QMutexLocker lockToProcess(&_queue->_tasksToProcessMutex); if (!_queue->_tasksToProcess.isEmpty() && _queue->_tasksToProcess.front() == task) { _queue->_tasksToProcess.pop_front(); someTasksLeft = !_queue->_tasksToProcess.isEmpty(); QMutexLocker lockToFinish(&_queue->_tasksToFinishMutex); emitTaskProcessed = _queue->_tasksToFinish.isEmpty(); _queue->_tasksToFinish.push_back(task); } } if (emitTaskProcessed) { emit taskProcessed(); } } QCoreApplication::processEvents(); } while (someTasksLeft && !thread()->isInterruptionRequested()); _inTaskAdded = false; }