AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

PostMessage und Speicherlecks

Ein Thema von globalv · begonnen am 23. Aug 2020 · letzter Beitrag vom 2. Sep 2020
Antwort Antwort
globalv

Registriert seit: 23. Aug 2020
4 Beiträge
 
#1

PostMessage und Speicherlecks

  Alt 23. Aug 2020, 07:00
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
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#2

AW: PostMessage und Speicherlecks

  Alt 23. Aug 2020, 07:16
Moin...

Ich kann eigentlich zum eigentlichen Problem nichts sagen. Weil ich mit Messages ungern arbeite. Die Frage an dich: Müssen es Messages sein oder tut´s auch ein Event? Da hast du das Problem nicht.

Trotzdem gilt auch in diesem Falle:
https://www.detlef-heibing.de/progra...rueckgabe.html

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

Achso...Willkommen im Club.

Geändert von haentschman (23. Aug 2020 um 07:19 Uhr)
  Mit Zitat antworten Zitat
globalv

Registriert seit: 23. Aug 2020
4 Beiträge
 
#3

AW: PostMessage und Speicherlecks

  Alt 23. Aug 2020, 07:23
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#4

AW: PostMessage und Speicherlecks

  Alt 23. Aug 2020, 07:30
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...
  Mit Zitat antworten Zitat
globalv

Registriert seit: 23. Aug 2020
4 Beiträge
 
#5

AW: PostMessage und Speicherlecks

  Alt 23. Aug 2020, 07:40
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.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#6

AW: PostMessage und Speicherlecks

  Alt 23. Aug 2020, 07:45
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.

...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.

Geändert von haentschman (23. Aug 2020 um 09:12 Uhr)
  Mit Zitat antworten Zitat
globalv

Registriert seit: 23. Aug 2020
4 Beiträge
 
#7

AW: PostMessage und Speicherlecks

  Alt 23. Aug 2020, 11:02
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.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.429 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: PostMessage und Speicherlecks

  Alt 2. Sep 2020, 12:03
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.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01: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