dispmap/svprocessor.cpp

96 lines
2.0 KiB
C++
Raw Normal View History

2014-07-11 20:35:48 +04:00
#include "svprocessor.h"
SvProcessor::SvProcessor(QObject *parent):
QObject(parent)
{
}
2014-07-25 11:32:00 +04:00
SvProcessor::SvProcessor(int numberOfWorkers)
2014-07-11 20:35:48 +04:00
{
2014-07-25 11:32:00 +04:00
uint i;
2014-07-11 20:35:48 +04:00
2014-07-25 11:32:00 +04:00
m_kernel = new SvKernel();
2014-07-11 20:35:48 +04:00
m_numberOfWorkers = numberOfWorkers;
m_workers = new SvWorker[m_numberOfWorkers];
m_threads = new QThread[m_numberOfWorkers];
for (i = 0; i < m_numberOfWorkers; i++) {
m_workers[i].setId(i);
m_workers[i].setKernel(m_kernel);
2014-07-28 00:04:18 +04:00
m_workers[i].setProcessor(this);
2014-07-11 20:35:48 +04:00
m_workers[i].moveToThread(&m_threads[i]);
2014-07-14 10:55:56 +04:00
connect(&m_threads[i], &QThread::started, &m_workers[i], &SvWorker::start);
2014-07-11 20:35:48 +04:00
connect(&m_workers[i], &SvWorker::finished, this, &SvProcessor::workerFinished);
}
}
2014-07-23 20:50:12 +04:00
2014-07-11 20:35:48 +04:00
SvProcessor::~SvProcessor()
{
delete m_kernel;
delete[] m_workers;
}
2014-07-25 11:32:00 +04:00
void SvProcessor::enqueueImage(SvPointCloud *pointCloud, SvImage *image)
2014-07-23 20:50:12 +04:00
{
SvProcessorTask *task;
2014-07-25 11:32:00 +04:00
for (uint i = 0; i < image->getHeight(); i++) {
2014-07-23 20:50:12 +04:00
task = new SvProcessorTask;
task->image = image;
task->line = i;
2014-07-25 11:32:00 +04:00
task->pointCloud = pointCloud;
m_taskQueue.enqueue(task);
2014-07-23 20:50:12 +04:00
}
}
SvProcessorTask SvProcessor::nextTask()
{
2014-07-25 11:32:00 +04:00
SvProcessorTask task, *taskPtr;
2014-07-28 20:25:39 +04:00
m_nextTaskMutex.lock();
2014-07-25 11:32:00 +04:00
if (!m_taskQueue.size()) {
2014-07-28 20:25:39 +04:00
m_nextTaskMutex.unlock();
2014-07-28 00:04:18 +04:00
throw SvNoMoreTasks();
2014-07-25 11:32:00 +04:00
}
2014-07-23 20:50:12 +04:00
2014-07-25 11:32:00 +04:00
taskPtr = m_taskQueue.dequeue();
2014-07-28 20:25:39 +04:00
2014-07-23 20:50:12 +04:00
m_nextTaskMutex.unlock();
2014-07-25 11:32:00 +04:00
2014-07-23 20:50:12 +04:00
task = *taskPtr;
delete taskPtr;
return task;
}
2014-07-11 20:35:48 +04:00
void SvProcessor::workerFinished(int workerId)
{
2014-07-14 18:05:08 +04:00
qDebug() << "worker " << workerId << " finished";
2014-07-11 20:35:48 +04:00
m_workersFinished++;
if (m_workersFinished == m_numberOfWorkers) {
2014-07-14 10:55:56 +04:00
qDebug() << "finished";
2014-07-22 20:37:29 +04:00
emit finished(time(NULL) - m_startTime);
2014-07-11 20:35:48 +04:00
}
}
void SvProcessor::start()
{
2014-07-25 11:32:00 +04:00
uint i;
2014-07-11 20:35:48 +04:00
2014-07-22 20:37:29 +04:00
m_startTime = time(NULL);
2014-07-11 20:35:48 +04:00
m_workersFinished = 0;
for (i = 0; i < m_numberOfWorkers; i++) {
2014-07-25 11:32:00 +04:00
m_threads[i].start(QThread::HighPriority);
2014-07-11 20:35:48 +04:00
}
}
void SvProcessor::stop()
{
2014-07-22 20:37:29 +04:00
emit stopped(time(NULL) - m_startTime);
2014-07-11 20:35:48 +04:00
}