Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Record New/Dispose resultiert in MemoryLeaks (https://www.delphipraxis.net/194310-record-new-dispose-resultiert-memoryleaks.html)

p80286 7. Nov 2017 22:51

AW: Record New/Dispose resultiert in MemoryLeaks
 
Eben drum habe ich da Bauchschmerzen!

Gruß
K-H

Glados 7. Nov 2017 22:57

AW: Record New/Dispose resultiert in MemoryLeaks
 
Ich muss in manchen Fällen 3 verschiedene Dateninformationen schicken.

2 davon sind für die GUI, die dritte für ein case-of. Das funktioniert aber leider nur mit dem WndProc() MessageHandler.
Mit einem eigenen wäre mir das lieber, dadurch verliere ich aber von den 3 Plätzen schonmal einen, um den MessageHandler anzugeben.

Daher die Record-Geschichte.

Uwe Raabe 7. Nov 2017 23:14

AW: Record New/Dispose resultiert in MemoryLeaks
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1385546)
Die Windows Message Queue ist 10.000 Einträge groß, da passen natürlich die anderen 40.000 nicht mehr rein.

In dem Fall könnte es helfen, den Rückgabewert von PostMessage zu prüfen und im Fehlerfall den Record selbst wieder freizugeben.

Dalai 7. Nov 2017 23:17

AW: Record New/Dispose resultiert in MemoryLeaks
 
Zitat:

Zitat von p80286 (Beitrag 1385551)
Oder bin ich da auf dem falschen Gleis?

Ich hatte kürzlich mit dem Versenden und Empfangen von Nachrichten zwischen zwei Formularen zu tun, und habe dazu Folgendes gelesen: Der Sender der Nachricht muss sicherstellen, dass der Empfänger mit der Nachricht auch etwas anfangen kann. Das heißt, sofern da ein Zeiger auf irgendeine Datenstruktur versendet wird, muss dieser bis zum Ende der Verarbeitung der Nachricht gültig sein. Ich weiß nicht, wie das bei einem solchen Konstrukt funktionieren soll, ob das Ziel des Zeigers nach dem Verlassen der Methode noch sinnvolle Daten enthält. Insofern teile ich deine Bedenken.

@Glados:
Von wo nach wo werden denn die Nachrichten versendet? Von einem Formular zum anderen? IIRC ist es doch so, dass solche Nachrichten gar nicht in der Message Queue von Windows landen sondern direkt vom Formular verarbeitet werden. Andererseits passt die Anzahl der Lecks exakt zu dem Limit der Message Queue von 10k ...

Grüße
Dalai

Glados 7. Nov 2017 23:21

AW: Record New/Dispose resultiert in MemoryLeaks
 
Das mit dem 10.000-Limit wusste ich nicht.
Dann wäre es glaube ich das Beste, wenn ich das mit dem Record sein lasse und Strings stattdessen so mitschicke
Delphi-Quellcode:
PostMessage(receiver, command, wParam, LPARAM(PChar('string')));
Ich schicke aus einem Thread heraus.

Habe meinen Branch vorsichtshalber mal hard-resetet. Ich denke eine andere Lösung ohne records ist doch wesentlich besser.

Eine eigene MessageQueue ohne das 10.000-Limit ggf. Aber das ist sicher nicht möglich.

Zacherl 7. Nov 2017 23:44

AW: Record New/Dispose resultiert in MemoryLeaks
 
Zitat:

Zitat von Glados (Beitrag 1385558)
Das mit dem 10.000-Limit wusste ich nicht.
Dann wäre es glaube ich das Beste, wenn ich das mit dem Record sein lasse und Strings stattdessen so mitschicke
Delphi-Quellcode:
PostMessage(receiver, command, wParam, LPARAM(PChar('string')));

Das klappt auch ausschließlich mit String-Konstanten.

Im Falle von:
Delphi-Quellcode:
var
  S: String;
begin
  S := 'blabla';
  PostMessage(receiver, command, wParam, LPARAM(PChar(@S[1])));
  // ...
  S := '123';
kannst du nie sicher sein, ob
Delphi-Quellcode:
S
noch
Delphi-Quellcode:
'blabla'
oder schon
Delphi-Quellcode:
'123'
enthält, wenn deine Nachricht bearbeitet wird. Selbes gillt natürlich für den Falle, dass der Thread den String in jeder Iteration modifiziert.

Ich kann dir nur nochmal raten von dem ganzen Message Gefummel zurück zu
Delphi-Quellcode:
TThread.Queue
zu wechseln. Da musst du dir weder um manuelle Speicherverwaltung, noch um irgendwelche Message-Queue Limits oder andere Edgecases Gedanken machen.

Glados 7. Nov 2017 23:55

AW: Record New/Dispose resultiert in MemoryLeaks
 
Zitat:

Ich kann dir nur nochmal raten von dem ganzen Message Gefummel zurück zu TThread.Queue zu wechseln. Da musst du dir weder um manuelle Speicherverwaltung, noch um irgendwelche Message-Queue Limits oder andere Edgecases Gedanken machen.
Ich versuche meine vorhandenen Codefragmente mal in Prozeduren zu packen und das so zu machen.

Jedoch würde ich aus den Threads eine Prozedur in einer anderen Unit aufrufen (mit Übergabe der Thread-ID), um einige unnötige Zeilen (
Delphi-Quellcode:
Queue(nil{* <= kommt hier dann die Thread-ID hin? *}, procedure begin end);
) zu sparen.

Ich melde mich sobald ich alles umgebaut habe.

Zacherl 8. Nov 2017 00:04

AW: Record New/Dispose resultiert in MemoryLeaks
 
Statt der ThreadId, musst du die Instanz des aufrufenden Threads also
Delphi-Quellcode:
Self
als Parameter vom Typ
Delphi-Quellcode:
TThread
übergeben, aber dann sollte es ohne Probleme funktionieren die Funktion auszulagern :)

Glados 8. Nov 2017 00:10

AW: Record New/Dispose resultiert in MemoryLeaks
 
Ok danke ich melde mich :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:25 Uhr.
Seite 2 von 2     12   

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