dataservice/conversionqueue.cpp

52 lines
1.5 KiB
C++

#include "conversionqueue.h"
ConversionRequest::ConversionRequest(QVector<QPointF> *buffer, const DataResult1D &data)
:buffer(buffer), data(data) {}
ConversionQueue::ConversionQueue(QObject *parent)
:QThread(parent), stopped(false)
{}
ConversionQueue::~ConversionQueue(){}
void ConversionQueue::run() {
mutex.lock();
bool stop = stopped || (requestQueue.size() == 0);
mutex.unlock();
while (!stop) {
mutex.lock();
if (requestQueue.size() > 0) {
ConversionRequest r = requestQueue.front();
DataResult1D data = r.data;
double min = data.ydata[0];
double max = data.ydata[0];
for (size_t i = 0; i < data.xdata.size(); ++i) {
r.buffer->push_back({data.xdata[i], data.ydata[i]});
if (data.ydata[i] < min)
min = data.ydata[i];
if (data.ydata[i] > max)
max = data.ydata[i];
}
emit dataConverted(QString::fromStdString(r.data.entityId), min, max);
requestQueue.pop_front();
stop = requestQueue.size() == 0 || stopped;
}
mutex.unlock();
}
}
void ConversionQueue::requestConversion(QVector<QPointF> *buffer, const DataResult1D &data) {
mutex.lock();
ConversionRequest r(buffer, data);
requestQueue.push_back(r);
mutex.unlock();
start();
}
void ConversionQueue::stop() {
mutex.lock();
stopped = true;
mutex.unlock();
}