類似の質問はたくさんありますが、適切な回答は見つかりませんでした。Qt:信号メインスレッド
私はサードパーティのライブラリを使用しています。
libのクラスの仮想メソッドのいくつかが呼び出されると、アプリケーションによって起動されたではないワーカースレッドから呼び出されます。このスレッドはQThreadではありません。
Qt :: DirectConnectionを使用してスロットに接続する場合のみ、このスレッドから送信できます。 SLOTのQObject :: sender()は常にNULLを返します。 例えば、deleteLater()を呼びたいと思っていますが、これはQThreadでのみスケジュールできます。
私はメインスレッドに戻る必要があると思いますが、メインスレッドでどのようにオブジェクトに信号を送ることができますか?
例:以下のメソッドが呼び出されると、サードパーティのライブラリで作成されたスレッドで同様の処理が行われます。
/*virtual*/ bool MediaPlayer::onEof()
{
stopTransmit();
emit sigFinished(); // slots only called if bound using Qt::DirectConnection
deleteLater(); // dtor is never called
return false;
}
次のような接続は、また、非QThreadコンテキスト内から構成されています
/*virtual*/ void
SipCall::state_answer_call::onEntering(SipCall& ref)
{
...
MediaPlayer* player = new MediaPlayer;
ref.connect(player, SIGNAL(sigFinished()), SLOT(slotMediaFinished()), Qt::DirectConnection);
...
}
明示Qt::DirectConnection
がなければ、SipCall::slotMediaFinished()
呼び出されることはありません。
こんにちは、ワーカースレッドは別のAPIから来ているので、このAPIのメソッドを使用する必要があります。しかし、とにかくあなたはこの実装からシグナルを出しました。あなたのアプリケーションのスレッドへのポインタを保持し、スレッドがスレッドの終わりを知らせ、(あなたのQt MainThreadに)接続し、スロット内で削除させるための解決策でしょうか。 (もしあなたが既にMainthreadにいたら、deleteLaterまで待つ必要はありません)。または、待つ必要がある場合は、オブジェクトを削除しないでください。フラグを付けたいオブジェクトを削除したり削除したりできます。 –
私は分かりません。ターゲットコード*が 'QThread'で実行されている限り、非' QThread'からのキューに入れられた接続にシグナルを送ることはOKです。どのように接続を作成していますか?コードを表示できますか? –
@ G.M。接続は通常のQObject :: connect()の変形です。特別なことは何もない。しかし、あなたのコメントは、おそらく接続自体が別のライブラリスレッド内で起こっていると思いました。だから私はデバッグを追加し、これを確認しました:接続は別の(Qtではなく)ワーカースレッド内から行われます。 – iwarv