Viele ähnliche Fragen existieren, aber keine passende Antwort gefunden.Qt: Signal Haupt-Thread
Ich benutze eine 3rd-Party-Bibliothek.
Wenn einige der virtuellen Methoden in den Klassen von lib aufgerufen werden, werden diese von einem Worker-Thread aufgerufen, der nicht von meiner Anwendung gestartet wurde. Dieser Thread ist kein QThread, noch könnte er jemals sein.
Ich kann von diesem Thread ausgeben, aber nur wenn ich den Steckplatz mit Qt :: DirectConnection verbinden. Das Ergebnis ist, dass QObject :: sender() im SLOT immer NULL zurückgibt. Ich möchte zum Beispiel deleteLater() aufrufen, aber das kann nur in einem QThread geplant werden.
Ich denke, ich muss zurück zum Haupt-Thread, aber wie kann ich das Objekt auf dem Haupt-Thread signalisieren?
Beispiel: Wenn die unten genannte Methode aufgerufen wird, geschieht dies in einem Thread, der von einer Drittanbieterbibliothek erstellt wurde.
/*virtual*/ bool MediaPlayer::onEof()
{
stopTransmit();
emit sigFinished(); // slots only called if bound using Qt::DirectConnection
deleteLater(); // dtor is never called
return false;
}
Die Verbindung wird aus einem nicht-QThread als Ganzes zu beziehen auch wie folgt:
/*virtual*/ void
SipCall::state_answer_call::onEntering(SipCall& ref)
{
...
MediaPlayer* player = new MediaPlayer;
ref.connect(player, SIGNAL(sigFinished()), SLOT(slotMediaFinished()), Qt::DirectConnection);
...
}
Ohne ausdrückliche Qt::DirectConnection
wird SipCall::slotMediaFinished()
nie aufgerufen.
Hallo, da Ihr Worker-Thread von einer anderen API kommt, müssen Sie die Methoden dieser API verwenden. Wie auch immer, Sie haben es geschafft, von dieser Implementierung zu signalisieren. Wäre es eine Lösung, einen Zeiger auf deinen Thread in deiner App zu halten, lass Thread das Ende deines Threads signalisieren, verbinde dich mit deinem Qt MainThread und lösche es im Slot. (Wenn Sie bereits in Mainthread sind, müssen Sie nicht warten bis deleteLater). Oder, wenn Sie warten müssen, löschen Sie das Objekt nicht, sondern markieren Sie es und löschen Sie markierte Objekte wann immer Sie wollen. –
Ich bin mir nicht sicher, ob ich das verstehe. Es sollte in Ordnung sein, ein Signal von einem Nicht-QThread an eine Warteschlange zu senden, solange der Zielcode * auf einem QThread ausgeführt wird. Wie erstellen Sie die Verbindung? Können Sie den Code anzeigen? –
@ G.M. Die Verbindung ist Ihre übliche QObject :: connect() Variante. Nichts besonderes daran. Aber Ihr Kommentar ließ mich denken, dass die Verbindung möglicherweise in einem anderen Bibliotheks-Thread auftritt. Also habe ich Debug hinzugefügt und bestätigt: Die Verbindung wird innerhalb eines anderen (nicht Qt) Worker-Threads hergestellt. – iwarv