QT4:Signal Slots ueber Threads. Pointer uebertragen/loeschen

Alles rund um die Programmierung mit Qt
Antworten
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

QT4:Signal Slots ueber Threads. Pointer uebertragen/loeschen

Beitrag von nando »

Hi,

ich habe eine server anwendung, die fuer jede client verbindung einen client-thread erzeugt.
die kommunikation zwischen dem hauptthread und den einzelnen client threads mache ich asychron ueber den signal/slot mechanismus.


immer wenn der server daten hat, die er an die client-threads verteilen soll, erzeugt er ein objekt InternalEvents auf dem heap und emitiert einen pointer auf das neu erzeugte InternalEvent an die client threads. das klappt auch super...

jetzt die frage...
wann / bzw. an welcher stelle muss / darf ich diese auf dem heap erzeugten InternalEvents objekte loeschen ?
nach dem verteilen ja nicht oder? da haben ja die threads noch pointer drauf.....


gruss,
nando
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Aus: postEvent
The event must be allocated on the heap since the post event queue will take ownership of the event and delete it once it has been posted. It is not safe to modify or delete the event after it has been posted.
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

Hi,
das habe ich auch gelesen... Nur werden die Objekte scheinbar nicht geloescht.. ich habe eine debug ausgabe im destruktor.....

das heisst doch aber, dass ich den pointer noch komplett in den slots benutzen kann..erst danach ist er nicht mehr gueltig oder ?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Nur werden die Objekte scheinbar nicht geloescht
Dann ist was anderes faul.

Normal ist das ja der clou. du erzeugst das event (dringend mit new) deine application verteilt es und loescht es wenn es fertig ist. Und nur die App weiss ja, wenn es mit dem verteilen fertig ist. Woelltest du selbst loeschen, wuesstest du doch gar ned wann, bzw. muesstest dich tief in die Application einklinken.

Also wahrscheinlich kommen deine leaks von was anderem.

Ciao ...
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

Hmm....

Mit "nach dem verteilen" meinst du, nach dem jeder SLOT aufgerufen und komplett abgearbeitet wurde ?
D.h. in der slot methode wo ich ja den pointer habe kann ich ihn noch nutzen? muss ja...

ganz sicher, dass postEvent genutzt wird, wenn man ein signal emittiert ueber threads ?

gruss,
nando
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn du dich entschieden hast, ob du Signal/Slots verwendest oder Events dann könne wir dir vielleicht besser helfen. Mein Argument war auf Events bezogen.
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

upsala hat geschrieben:Wenn du dich entschieden hast, ob du Signal/Slots verwendest oder Events dann könne wir dir vielleicht besser helfen. Mein Argument war auf Events bezogen.
Ich mache es mit signals/slots.... aber die arbeiten doch intern auch mit events...also postEvent etc. .... dachte ich zumindest ....
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Ja, intern, das hat aber nichts mit deinen übergebenen Daten zu tun...
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

also wenn man signal/slots verwendet wirde der pointer automatisch von qt deleted......
wenn man es manuell mit postEvent macht, dann nicht....
ich versteh zwar nicht ganz warum aber mit signal/slots scheint es zu gehen...

gruss,
nando
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Wenn du einen Pointer per Signal/Slot überträgst wird dieser nicht von Qt gelöscht. Warum sollten sie soetwas tun? Und ich würde bei asynchronen Verbindungen den Pointer auch nicht gleich nach einem emit vom Sender löschen lassen.

Bei postEvent werden die QEvents(!) von Qt gelöscht wenn das Event an alle Empfänger verteilt worden ist.
nando
Beiträge: 321
Registriert: 28. Oktober 2004 13:16

Beitrag von nando »

upsala hat geschrieben:Und ich würde bei asynchronen Verbindungen den Pointer auch nicht gleich nach einem emit vom Sender löschen lassen.
...genau das ist/war ja mein problem.... wann soll/darf ich diesen pointer loeschen... ????
ich habe ganz viele client objekte, die diesen pointer uber den slot bekommen und damit was machen.......

deswegen darf ich ja nach dem emit nicht gleich delete aufrufen und sozusagen den client objekten ihr uebergebenes objekt unter den fuessen wegloeschen....

gruss,
nando
Antworten