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

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

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

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

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

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

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

【问题讨论】:

    标签: c++ multithreading qt


    【解决方案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);
      }
      

      【讨论】:

        猜你喜欢
        • 2018-06-27
        • 2010-09-08
        • 2013-04-11
        • 1970-01-01
        • 2012-03-31
        • 2011-09-25
        • 1970-01-01
        • 1970-01-01
        • 2021-03-18
        相关资源
        最近更新 更多