2011-12-30 14 views
0

今Qtには2つの異なるオブジェクトを持つ2つのスレッドがあるという問題に直面しています。これらのオブジェクトはQObjectsではないため、Signals/Slotsを使用して通信することはできません。最初のスレッドはプライマリスレッドであり、2番目のスレッドは無限ループにあり、キューを使用してコマンドオブジェクトを処理します。Qtの異なるスレッドでオブジェクトを同期する

メインスレッドは、処理スレッドが要求を終了するまで待機する必要があります。

グローバルミューテックスを使用せずに2つの異なるスレッドを同期させるにはどうしたらいいですか?

+0

私は、このような状況があることを正しく理解していますか?Thread1はデータを受け取り、処理のためにThread2に渡し、次のデータを読む前にThread2が終了するのを待ちますか? – Karlson

+0

はい、その通りですが、signal/slotsはオプションではないので、同期は問題です – Anonymous

+0

thread2が処理したデータを処理するまでスレッド1が動かない場合、なぜマルチスレッドが必要ですか?あなたが必要とするのはReceive-> Processのスレッドです。 – Karlson

答えて

2

mutexを使用できます。キューから「要求」を取り出すたびにロックし、キューに追加するたびにロックします。あなたはこのような

何かを持っていることがあり、この方法は:

#include <QMutex> 
#include <QWaitCondition> 

class processingThread 
{ 
public: 
    void appendToQueue(Request req) 
    { 
     sync.lock(); 
     queue.append(req); 
     sync.unlock(); 
     cond.wakeAll();    
    } 

protected: 
    void run() 
    { 
     while(1) 
     { 
      sync.lock(); 
      QWaitCondition wait(&sync); 
      Request current = queue.takeFirst(); 

      // process request 

      sync.unlock() 
     } 
    } 

private: 
    QList<Request> queue; 
    QMutex sync; 
    QWaitCondition cond; 
}; 

あなたは今どのスレッドからprocessingThread :: appendToQueueを呼び出し、同期化されたデータを取得することができます。このパターンを使用して、スレッド内のデータを同期させることができます。同期したいデータへのアクセスをロックすることを覚えておいてください。 QWaitConditionは、スレッドが必要なときにのみ動作するようにすることに注意してください。

+0

私はQWaitConditionを使用して行く方法だと思います。私のソリューションでは、両方のスレッドが単一のオブジェクトにアクセスし、QMutexとWaitCondtionを使用して同期できるようにしました。問題を解決したら、サンプルコードのスナップショットを投稿します。 – Anonymous

0

コマンドオブジェクトには「同期」オブジェクトが含まれている可能性があるため、送信側はこのオブジェクトを待つことができます。 syncオブジェクトはブール値とQWaitconditionを必要とします。これはグローバルであってはなりません。

関連する問題