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

11
如何在Qt中解决以下问题是一个好的方法:
我有一个传感器类,它持续产生数据。针对这些数据需要执行一系列操作,这可能需要相当长的时间。为此,我拥有一些额外的类。基本上,每次记录新的数据项时,第一个类应获取数据,处理数据,将其传递给下一个类,以此类推。
传感器 --> 类1 --> ... --> 最后一个类
我希望将管道的各个单独类放入各自的线程中,这样当第2个类处理第n个样本时,类1可以已经处理第n+1个样本...
此外,由于各个步骤的性能可能差异很大(例如传感器比其他部分快得多),而且我不关心过时的数据,因此我希望类1(以及之后的所有内容)始终从其前置项获取最新的数据,舍弃旧数据。因此,在管道的各个步骤之间没有大型缓冲区。
起初,我考虑使用Qt::QueuedConnections进行信号/槽操作,但我认为这会引入一个队列,其中包含等待较慢的管道部分处理过时样本的内容?
2个回答

5

请自行构建一个只包含一个元素的“队列”类,它应该包括以下内容:

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

“enqueue”函数只是:
lock mutex
Replace data with new data
dataReady = true
signal condition variable

“dequeue”函数就是:
lock mutex
while (!dataReady) cond_wait(condition, mutex)
tmpData = data
data = NULL (or zero)
dataReady = false
unlock mutext
return tmpData

数据类型可以作为模板参数。

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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接