Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   PostMessage und Speicherlecks (https://www.delphipraxis.net/205295-postmessage-und-speicherlecks.html)

globalv 23. Aug 2020 07:00

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:
// 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;
Ich habe System.ReportMemoryLeaksOnShutdown := true gesetzt, um Speicherlecks zu erkennen.
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

haentschman 23. Aug 2020 07:16

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:
https://www.detlef-heibing.de/progra...rueckgabe.html :zwinker:

PS: wie oft ich diesen Link in den letzten Tagen hevorgekramt habe...:gruebel:

Achso...Willkommen im Club.:dp:

globalv 23. Aug 2020 07:23

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

haentschman 23. Aug 2020 07:30

AW: PostMessage und Speicherlecks
 
Zitat:

Zum Glück wende ich dieses Verfahren nicht an
...eigentlich schon. Du erzeugst prinzipiell ein Objekt an einer anderen Stelle und gibst es an einer anderen frei. Die Ebene ist anders... :zwinker:

globalv 23. Aug 2020 07:40

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.

haentschman 23. Aug 2020 07:45

AW: PostMessage und Speicherlecks
 
Zitat:

Aber dieses Verfahren scheint weit verbreitet zu sein
Es geht ja prinzipiell auch. Der constructor ist ein Beispiel dafür. Nuuur...die function sollte im Namen ein "Create" enthalten. Aber du hast eine Message. Jeder der die Message empfängt, sollte aber wissen, daß er das object freizugeben hat. :wink:

...unabhängig davon löst das nicht dein Problem. :?

http://www.delphigroups.info/2/a3/472864.html
...kannst du daraus was verwenden? (nicht selbst gelesen)

...einen habe ich noch. (Sendmessage, Object, Free)
https://www.delphipraxis.net/180871-...ad-senden.html

Zitat:

Es ist ja nicht sichergestellt, dass der Empfänger die Nachricht auch in jedem Fall erhält.
...ist wohl wahr. :wink:

globalv 23. Aug 2020 11:02

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.

Blup 2. Sep 2020 12:03

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 12:49 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz