4 Stimmen

QT - Verständnis der folgenden Lambda-Ausdruck für einen SLOT

Ich versuche derzeit, die neue QT5-Signal-/Slot-Syntax zu verstehen

connect(sender, &Sender::valueChanged, [=](const QString &newValue) {
       receiver->updateValue("senderValue", newValue);
   });

Jetzt ist meine Frage, wo sich die Adresse des Empfänger-Slots im obigen Ausdruck befindet? Ich wollte das wissen, weil was passiert, wenn ein Signal im ThreadA ist und der Slot im ThreadB ist und ich es als eine Queued-Verbindung haben wollte?

7voto

Mat Punkte 195740

Ein Slot ist ein Stück Code, es "lebt" nicht in einem Thread - ein Thread könnte es ausführen oder auch nicht, aber der Code selbst gehört keinem Thread. (Wenn der Slot eine Member-Funktion ist, dann gehört das als Empfänger definierte Qt-Objekt einem Qt-Thread an - das ist eine Eigenschaft des Objekts, nicht der Funktion.)

Im obigen Code generiert der Compiler ein Objekt, das:

  • receiver nach Wert erfasst ([=])
  • einen Funktionsaufratsoperator hat, der mit einem Verweis auf ein konstantes QString aufgerufen werden kann.

Dieses Objekt wird zusammen mit den anderen beiden Argumenten an connect übergeben. Es handelt sich nicht um ein QObject, daher hat es keinen eigenen Thread im Qt-Sinn. Worauf Sie achten müssen ist folgendes:

  • was receiver zeigt, bleibt so lange bestehen, wie das Signal verbunden ist
  • receiver->updateValue(...) ist threadsicher - es wird im Kontext/Thread von sender aufgerufen.

Wenn receiver->updateValue im Thread/Kontext von receiver aufgerufen werden muss, verwenden Sie nicht diese Syntax für den connect-Aufruf, sondern diejenige, in der Sie sowohl Sender als auch Empfänger und den Verbindungstyp angeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X