2011-11-11 8 views
11

Qtの次の問題を解決するにはどうすればよいでしょうか。Qtのマルチスレッドデータ処理パイプライン

私はセンサークラスを持っています。このデータでは、いくつかの操作が次々に実行されなければならず、かなり時間がかかることがあります。このため私はいくつかのクラスを追加しています。基本的には、新しいデータ項目が記録されるたびに、最初のクラスはデータを取得し、処理し、次のデータに渡すなどしなければなりません。

センサー - >クラス1 - > ... - >最後のクラス

そのクラス1は、すでにサンプルnに働くかもしれので、私は、自分のスレッドにパイプラインの個々のクラスを入れたいです+1はクラス2がサンプルを処理しているとき...

また、個々のステップがパフォーマンス(例えば、センサーが他の方法よりも速い)で大きく異なることがあるため、古いデータには興味がありませんクラス1(およびその後ろのすべて)は、古いデータを破棄して、前のクラスから最新のデータを常に取得するようにします。したがって、パイプラインのステップ間に大きなバッファはありません。

最初に私は信号/スロットのQt :: QueuedConnectionsを使用することを考えましたが、パイプラインの遅い部分で処理されるのを待っている古いサンプルがたくさんあるキューを導入すると思いますか?

答えて

3

あなたが扱っているのは、プロデューサーコンシューマーパターンです。ここでその概要を概説しています。 http://en.wikipedia.org/wiki/Producer-consumer_problem

QMutexを使用して、データへのアクセスを一度に1つのスレッドに制限したいとします。 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); 
} 
5

独自の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 

タイプは、テンプレートすることができパラメータ。

関連する問題