![]() |
PostMessage und Speicherlecks
Hallo zusammen,
Ich verwende PostMessage, um eine Instanz einer Klasse (TMyData) zu senden, die variable Zeichenfolgen enthält. Wenn PostMessages fehlschlägt oder die gesendete Instanz vom Message-Handler empfangen wird, rufe ich auch den Destruktor auf. Zu Erläuterung ein Ausschnitt aus dem Code:
Delphi-Quellcode:
Ich habe System.ReportMemoryLeaksOnShutdown := true gesetzt, um Speicherlecks zu erkennen.
// Data to send
TMyData=class Data1: string; Data2: string; Data3: string; end; // send procedure TTestClass1.PostTestData( AData1: string; AData2: string; AData3: string); var test_data: TMyData; begin test_data:= TMyData.Create; test_data.Data1:= AData1; test_data.Data2:= AData2; test_data.Data3:= AData3; if not PostMessage(my_handle,WM_MY_MESSAGE,0,LPARAM(test_data)) then test_data.Free; end; // receive procedure TTestClass2.Message_WM_MY_MESSAGE(var Msg: TMessage); var test_data: TMyData; begin test_data := TMyData(Msg.LParam); // is this also compatible with 64 Bit? try // Do some work finally test_data.Free; end; end; Obwohl ich den Destruktor für alle Objekte aufrufe, wird ein Speicherleck bei TMyDatafestgestellt. PostMessage wird auch innerhalb einer Anwendung verwendet. Kann es sein, dass im Falle von PostMessage es sich um eine "Falschmeldung" handelt? Und sollte man eigentlich mit PostMessage variable Zeichenfolgen über eine Klasse versenden? Viele Grüße |
AW: PostMessage und Speicherlecks
Moin...:P
Ich kann eigentlich zum eigentlichen Problem nichts sagen. Weil ich mit Messages ungern arbeite. :oops: Die Frage an dich: Müssen es Messages sein oder tut´s auch ein Event? :gruebel: Da hast du das Problem nicht. Trotzdem gilt auch in diesem Falle: ![]() PS: wie oft ich diesen Link in den letzten Tagen hevorgekramt habe...:gruebel: Achso...Willkommen im Club.:dp: |
AW: PostMessage und Speicherlecks
Vielen Dank erstmal für die Antwort.
Leider müssen es Messages sein, da noch Threads mit im Spiel sind und das Design-technisch so gefordert wird. Danke für den Link. Zum Glück wende ich dieses Verfahren nicht an. :D |
AW: PostMessage und Speicherlecks
Zitat:
|
AW: PostMessage und Speicherlecks
Ja, das stimmt schon irgendwie. Mhhh...Aber dieses Verfahren scheint weit verbreitet zu sein. Ich bin halt nur misstrauisch geworden, da mir der memory leak report an dieser Stelle ein Speicherleck gemeldet hat. Durch Debugausgaben konnte ich auch erkennen, dass der Destructor aufgerufen wurde...Habe es in einer ganz simplen Beispiel-Anwendung mal nachgeprüft.
|
AW: PostMessage und Speicherlecks
Zitat:
...unabhängig davon löst das nicht dein Problem. :? ![]() ...kannst du daraus was verwenden? (nicht selbst gelesen) ...einen habe ich noch. (Sendmessage, Object, Free) ![]() Zitat:
|
AW: PostMessage und Speicherlecks
Vielen Dank für die Links.
Der Letzte scheint mir sehr hilfreich zu sein. Zwar erklärt es noch nicht wieso ich Leaks reported bekomme, aber es macht vielleicht eher Sinn, dass ich das Ganze auf eine Thread-Queue umstelle und mich nur über eine Änderung benachrichtigen lasse. |
AW: PostMessage und Speicherlecks
Nur weil Postmessage True zurückliefert, bedeuted das nicht, die Nachricht wird vom Empfänger auch irgendwann verarbeitet.
z.B. - Das Empfänger-Postfach läuft über, da die Nachrichten nicht schnell/häufig genug abgerufen werden. - Der Empfänger wird beendet, bevor alle Nachrichten verarbeitet wurden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz