SIGNAL/SLOT - Sichtbarkeitsbereich
-
Hallo,
ich frage mich gerade was der Sichtbarkeitsbereich von Objekten ist, die mit dem Qt SIGNAL/SLOT Verfahren übergeben werden.
Wenn man beispielsweise in einer Methode ein Objekt auf dem Stack anlegt
Foo f;
dann wird der Destruktor nach Beenden der Methode aufgerufen und das Objekt wird zerstört.
Nun kann man in Qt aber mit
Foo f; emit mySignal(f);
zum Beispiel das Objekt an einen anderen Thread übergeben. Was passiert dann mit dem Sichtbarkeitsbereich von dem Objekt Foo? Wird das Objekt kopiert?
-
Spock143 schrieb:
Wird das Objekt kopiert?
Kommt auf die connections an, die dran hängen:
* DirectConnection -> SLOTs werden sofort ausgeführt. Will der SLOT ne Referenz, bekommt er die auch direkt auf f.
* QueuedConnection -> Die Signale werden samt Parametern in eine Queue geworfen, Parameter dabei kopiert.Deshalb: Willst du auch threadübergreifend immer Referenzen auf die tatsächlichen Objekte, musst du Pointer in die SIGNAL/SLOT-Parameterlisten packen.
-
Danke für die Erklärungen!
Das heißt also das bei einer QueuedConnection das Objekt Foo vollständig kopiert wird und dann erst mit Beendigung, d.h. Ausführung des SLOTS zerstört wird?
connect(thread, SIGNAL(mySignal(Foo&)), this, SLOT(mySlot(Foo&)), Qt::QueuedConnection);
Wenn man Pointer übergibt muss man natürlich sicherstellen, dass das Objekt auf das der Pointer zeigt auch existiert.
Klingt logisch.