Qt中的多线程数据处理管道

Posted

技术标签:

【中文标题】Qt中的多线程数据处理管道【英文标题】:Multithreaded data processing pipeline in Qt 【发布时间】:2011-11-11 15:26:26 【问题描述】:

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

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

传感器 --> 第一类 --> ... --> 最后一类

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

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

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

【问题讨论】:

【参考方案1】:

只需构建您自己的单元素“队列”类。它应该有:

A piece of data (or pointer to data)
A Boolean "dataReady"
A mutex
A condition variable

“入队”功能就是:

lock mutex
Replace data with new data
dataReady = true
signal condition variable

“出队”功能就是:

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

数据的类型可以是模板参数。

【讨论】:

【参考方案2】:

您正在处理的是生产者消费者模式。您可以在此处找到对此的一般概述。 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);

【讨论】:

以上是关于Qt中的多线程数据处理管道的主要内容,如果未能解决你的问题,请参考以下文章

纯 C++ 中的多线程?

(73课)Qt中的多线程编程

qt中的多线程

第73课 Qt中的多线程编程

Qt中的多线程编程

使用 Qt 的多线程应用程序有啥问题(错误 SIGSEGV)