問題タブ [queued-connection]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
qt - キューに入れられた接続のロギング
Qt 5.4 で構築された複雑な状態エンジン システムを使用しています (カスタム状態エンジン クラスを使用)。
そのコードの一部は、イベント、遷移などのログです。状態エンジンで何が起こっているかを完全に追跡できるように、エンジン/状態オブジェクトが受け取るすべてのイベントをログに記録することは非常に重要です。
ほとんどのイベント タイプでは、ロギングは簡単です。ただし、キューに入れられた接続 (つまり、メタ コール イベント) をログに記録できませんでした。QMetaCallEvent はプライベートなので、できることはあまりありません。しかし、そのような Qt の不可欠な部分が適切に検査できないとは信じがたいです。
キューに入れられた接続 (可能であれば、シグナル名、スロット名、送信者名、受信者名、および引数を含む) をログに記録できる方法はありますか?
multithreading - QT5 クロススレッド通信、「この」コンテキストでスロットが呼び出されない
moveToThread メソッドのおかげで 、オブジェクトMainWorkerが別のスレッドとして実行されました。MainWorkerには、別のスレッドとしても実行されるメンバーSubWorkerがあります。両方のスレッドが無限ループで動作しています。
アイデアは、MainWorkerとSubWorkerの両方がいくつかの個別の計算を実行することです。SubWorkerが計算を完了するたびに、 MainWorkerに結果を通知する必要があります。
したがって、 SubWorker によって発行されたシグナルとMainWorkerのスロットとの間の最初の接続を直感的に作成しましたが、機能していなかったため、潜在的な問題を除外するためにさらに 2 つの接続を作成しました。
接続2と3が期待どおりに機能するため、機能していないのはまさに私が必要としているクロススレッド通信であるようです。私の質問は: 接続 1 を機能させるにはどうすればよいですか?
編集:どうやら、Karsten の説明の後、無限ループが EventLoop をブロックしていることは明らかです。新しい質問は、無限ループ スレッドからその親スレッドにメッセージ (シグナルなど) を送信するにはどうすればよいかということです。
私はQtを初めて使用します。完全に間違っている可能性が高いです。最小限の (ない) 動作例を次に示します。
MainWorker.h
SubWorker.h
main.cpp