Qt中的多线程数据处理流水线

use*_*903 11 c++ qt multithreading

在Qt中解决以下问题的好方法是什么:

我有一个传感器类,它不断产生数据.在这些数据上,必须一个接一个地执行几个操作,这可能需要很长时间.为此我还有一些额外的课程.基本上,每次记录新数据项时,第一个类应该获取数据,处理数据,将其传递给下一个数据项,依此类推.

传感器 - > 1级 - > ... - >最后一堂课

我想将管道的各个类放入它们自己的线程中,这样当类2处理样本n时,类1可能已经在样本n + 1上工作了...

此外,由于各个步骤的性能差异很大(例如传感器比其他步骤快得多)而且我对过时的数据不感兴趣,我希望第1类(及其后的所有内容)始终从中获取最新的数据他们的前任,丢弃旧数据.因此,管道的步骤之间没有大的缓冲区.

首先我想过将Qt :: QueuedConnections用于信号/插槽,但我想这会引入一个充满过时样本的队列,等待管道的较慢部分处理?

Nem*_*emo 5

只需构建自己的单元素"队列"类.它应该有:

A piece of data (or pointer to data)
A Boolean "dataReady"
A mutex
A condition variable
Run Code Online (Sandbox Code Playgroud)

"入队"功能只是:

lock mutex
Replace data with new data
dataReady = true
signal condition variable
Run Code Online (Sandbox Code Playgroud)

"出队"功能只是:

lock mutex
while (!dataReady) cond_wait(condition, mutex)
tmpData = data
data = NULL (or zero)
dataReady = false
unlock mutext
return tmpData
Run Code Online (Sandbox Code Playgroud)

数据类型可以是模板参数.


小智 3

您正在处理的是生产者消费者模式。您可以在此处找到对此的总体概述。 http://en.wikipedia.org/wiki/Producer-consumer_problem

您希望使用 QMutex 来限制一次只有一个线程对数据的访问。使用 QMutexLocker 来锁定它。

对于一个非常简单的例子:

QList<quint32> data;
QMutex mutex;

//  Consumer Thread calls this
int GetData()
{
   quint32 result(-1); // if =1 is a valid value, you may have to return a bool and 
                       // get the value through a reference to an int 
                       // in the parameter list.

   QMutexLocker lock(&mutex);

   if (data.size())
   {
      result = data.front();  // or back
      data.clear();
   }

   return result;
}

// Producer Thread calls this
void SetData(quint32 value)
{
    QMutexLocker lock(&mutex);

    data.push_back(value);
}
Run Code Online (Sandbox Code Playgroud)