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中的多线程数据处理管道的主要内容,如果未能解决你的问题,请参考以下文章