QObject
のオブジェクトをQObject::moveToThread
のスレッドに移動すると、オブジェクトが受け取るすべてのシグナルがそのスレッド内で処理されます。しかし、スロットが直接呼び出された場合(object->theSlot()
)、呼び出しはブロックされます。スレッド内でその呼び出しを実行し、直ちに呼び出しスレッドに制御を戻す通常の方法は何でしょうか? QTimer
のハックはカウントされません。単一の目的の接続を設定し、それをもう一度削除することは、他のすべてが失敗した場合には解決策になるかもしれません。QObject :: moveToThreadとそのスレッド内でメンバ関数を実行する
答えて
Qtの:: CONNECTIONTYPEはQtの:: QueuedConnection
これは私が探しているものに非常に近いと思います。オブジェクトが既に別のスレッドにあると仮定して、これは 'AutoConnection'と同じように動作しませんか? – pmr
あなたはそうです。 AutoConnectionは同じですが、しかし!私はいつもQMetaObject :: invokeMethodを使用する私の意図を知るために、この引数をコードに入れることを前提にしています –
QFuture<T> QtConcurrent::run (Function function, ...)
を使用すると、別のスレッド内で実行を開始し、QFutureWatcher
を使用して結果を取得できます。 movetoThread
に電話する必要はありません。
基本的には何か:
QFutureWatcher<T>* watch = new QFuture(0);
connect(watch, SIGNAL(finished()), this, SLOT(handleResult()));
QFuture<T> future = QtConcurrent::run(myObj, &QMyObject::theSlot(), args...);
watch.setFuture(future);
....
//slot
private void handleResult(){
if(future->isCancelled())
return;
T mydata = watch->future()->result();
// use your data as you want
}
QtConcurrent::run
は、いくつかのスレッドで実行したことには、このオブジェクトのメソッドをスケジュールします。それはノンブロッキングです。一方、QFuture::result()
は、計算がまだ進行中であれば、結果が得られるまでブロックします。そのため、finished()
を使用して計算が終了したときに通知するには、もう一方のオブジェクトが必要です。私はQtであなたの問題のより良い設計を考えることができません。
これは 'QtConcurrent'スレッドの文脈で' TheSlot'を実行し、 'MyObject 'のスレッドの文脈では実行しません'。 –
はい、それは重要ですか?なぜ私は下落したのですか?結局のところ、彼は呼び出し側スレッドとは別のスレッドで 'theSlot()'を実行したいだけです。これはスレッドを作成してstartを呼び出すよりも優れています:[Qthread vs QRunnable](http://developer.qt.nokia.com/videos/watch/enhancing_your_qt_application_with_multiple_threads)私は 'pmr'を誤解しましたか? – UmNyobe
私はあなたにdownvoteしなかった。あなたの代わりに 'moveToThread'を外して、他のすべてのスロットを非同期にします。それには欠点がありますが、それは特定の状況下ではまだ理にかなっています。私はトンのハックのために行くだろう。 – pmr
- 1. 別のクラスのメンバ関数内でメンバ関数からスレッドを開始
- 2. スレッド同期とメンバ関数
- 3. クラス関数内でスレッドを実行中
- 4. 2つのスレッドでmovetoThreadを使用して2つのQObject間でシグナルとスロットを接続する方法
- 5. メンバ関数を実行するスレッドを作成するvariadicテンプレートメンバ関数のintとintの不一致
- 6. ThreadLocalとJavaのスレッド内のメンバ変数
- 7. スレッド内の関数の実行または関数内のスレッドの使用
- 8. pythonのopencvで "QObject :: moveToThread:"というエラーを修正する方法は?
- 9. 渡すクラスのメンバ関数::スレッド
- 10. WxPythonのGUIスレッドで関数を実行
- 11. メンバ関数の実装
- 12. メンバ関数をメンバ関数のパラメータとして渡す
- 13. そのクラスのメンバ関数内でクラスを使用できますか?C++
- 14. スレッドを作成し、ループ内で関数を割り当てて実行する
- 15. 関数リストとその実行Erlang
- 16. スレッド内でソケットストリームを実行する
- 17. 制限数を持つ複数のスレッドで関数を実行
- 18. はstdするメンバ関数を渡す::スレッド
- 19. C++ 11メンバ関数をコンパイルしてスレッドを初期化する
- 20. 別のスレッドでメンバー関数を実行する
- 21. ループ内で複数のスレッドを実行する方法
- 22. UIスレッド項目を使用して別のスレッドで関数を実行する
- 23. 演算子のオーバーロード:メンバ関数と非メンバ関数の比較?
- 24. Pythonからバックグラウンドでmvnを実行Popenとスレッド関数
- 25. メンバ関数とコピーコンストラクタ
- 26. std :: varadicメンバ関数への関数とその後のバリデーションテンプレート引数のバインド
- 27. スレッド内で実行中のオブジェクトの関数を呼び出せません
- 28. スレッドの実行終了後の関数の実行
- 29. Azure関数 - 別のスレッドで長時間実行する
- 30. 関数内でeval関数を実行する
に設定してあなたは
QMetaObject::invokeMethod
を使用することができます。その後、 'のQObject :: moveToThread'を使用して、それをしたいですか?そうでなければ、私はむしろすべての計算をシグナルを受け取らないオブジェクトに入れて、私のメソッドを使うでしょう... – UmNyobe