use*_*903 11 c++ qt multithreading
在Qt中解决以下问题的好方法是什么:
我有一个传感器类,它不断产生数据.在这些数据上,必须一个接一个地执行几个操作,这可能需要很长时间.为此我还有一些额外的课程.基本上,每次记录新数据项时,第一个类应该获取数据,处理数据,将其传递给下一个数据项,依此类推.
传感器 - > 1级 - > ... - >最后一堂课
我想将管道的各个类放入它们自己的线程中,这样当类2处理样本n时,类1可能已经在样本n + 1上工作了...
此外,由于各个步骤的性能差异很大(例如传感器比其他步骤快得多)而且我对过时的数据不感兴趣,我希望第1类(及其后的所有内容)始终从中获取最新的数据他们的前任,丢弃旧数据.因此,管道的步骤之间没有大的缓冲区.
首先我想过将Qt :: QueuedConnections用于信号/插槽,但我想这会引入一个充满过时样本的队列,等待管道的较慢部分处理?
只需构建自己的单元素"队列"类.它应该有:
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)
| 归档时间: |
|
| 查看次数: |
1631 次 |
| 最近记录: |