Seite 1 von 1

QT4:Signal Slots ueber Threads. Pointer uebertragen/loeschen

Verfasst: 8. Mai 2007 09:05
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

Verfasst: 8. Mai 2007 09:09
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.

Verfasst: 8. Mai 2007 09:17
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 ?

Verfasst: 8. Mai 2007 09:35
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 ...

Verfasst: 8. Mai 2007 09:42
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

Verfasst: 8. Mai 2007 12:25
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.

Verfasst: 8. Mai 2007 15:27
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 ....

Verfasst: 8. Mai 2007 16:14
von upsala
Ja, intern, das hat aber nichts mit deinen übergebenen Daten zu tun...

Verfasst: 9. Mai 2007 10:02
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

Verfasst: 9. Mai 2007 12:24
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.

Verfasst: 9. Mai 2007 13:09
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