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.


Anmelden zum Antworten