2011-07-26 9 views
0

メインアプリケーションスレッドからエミュレートされた信号用のスロットを持つワーカースレッドが必要でした。Qt:メインスレッド上にスロットとエミッタがあるワーカースレッド

  1. どのようにそのワーカースレッドの「:: run()」メソッドが見えますか?明らかに何らかのループが必要な場合や、スレッドがすぐに終了する場合があります。入ってくるスロットを処理できるようにしておきます。そのループはどのように見えますか?スリープとポンプメッセージに相当するものはありますか?どのようにポンプ?

  2. スロットの処理がワーカースレッドのコンテキストで行われるように、スレッドのスロットに渡すすべてのオブジェクトを "MoveToThread()"する必要がありますか?

ありがとうございます。

+0

ご覧ください:http://stackoverflow.com/questions/3911086/qthread-threaded-rly/3911440#3911440 –

答えて

1

もう少し掘りましたか? QThread :: runのデフォルトの実装では、メッセージループである "exec"が呼び出されます。だから余計な作業は必要ありません。私のQThreadのコンストラクタで、私はこの追加:結果

this->start(); 
QObject::moveToThread(this); 

を、私のスレッドは、建設時に開始し、スレッドスロットを目的としたスレッド外のすべての信号は、私のスレッドのコンテキストで実行されます。

+1

いいえ! :)それはQThreadsを使うのに間違った、そして最も反復された方法です。短い答え(QThreadの文書に反して)。 QThreadをサブクラス化しないでください。 QObjectをサブクラス化して、必要な作業を行い、moveToThread()を使用してQThreadのインスタンスに移動します。 –

+1

興味深いアプローチ。それのメリットは何ですか?また、上記の方法を使って大災害の可能性はありますか? – JasonGenX

+0

QThreadをサブクラス化し、それをコンストラクタ内の独自のスレッドに移動する方法を試したところ、正しく問題を解決するのは非常に難しかったです。特に、deleteLater()を呼び出すことはできません。信号とスロットが導入されたときに実行される命令には、他の問題がありました。それはしばしばうまくいくようだが、それは完全な混乱である。 –

関連する問題