AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Record New/Dispose resultiert in MemoryLeaks
Thema durchsuchen
Ansicht
Themen-Optionen

Record New/Dispose resultiert in MemoryLeaks

Ein Thema von Glados · begonnen am 7. Nov 2017 · letzter Beitrag vom 8. Nov 2017
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#11

AW: Record New/Dispose resultiert in MemoryLeaks

  Alt 7. Nov 2017, 23:51
Eben drum habe ich da Bauchschmerzen!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#12

AW: Record New/Dispose resultiert in MemoryLeaks

  Alt 7. Nov 2017, 23:57
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#13

AW: Record New/Dispose resultiert in MemoryLeaks

  Alt 8. Nov 2017, 00:14
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Dalai
Dalai
Online

Registriert seit: 9. Apr 2006
1.682 Beiträge
 
Delphi 5 Professional
 
#14

AW: Record New/Dispose resultiert in MemoryLeaks

  Alt 8. Nov 2017, 00:17
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
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#15

AW: Record New/Dispose resultiert in MemoryLeaks

  Alt 8. Nov 2017, 00:21
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
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.

Geändert von Glados ( 8. Nov 2017 um 00:27 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#16

AW: Record New/Dispose resultiert in MemoryLeaks

  Alt 8. Nov 2017, 00:44
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
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 S noch 'blabla' oder schon '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 TThread.Queue zu wechseln. Da musst du dir weder um manuelle Speicherverwaltung, noch um irgendwelche Message-Queue Limits oder andere Edgecases Gedanken machen.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)

Geändert von Zacherl ( 8. Nov 2017 um 00:47 Uhr)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#17

AW: Record New/Dispose resultiert in MemoryLeaks

  Alt 8. Nov 2017, 00:55
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 (Queue(nil{* <= kommt hier dann die Thread-ID hin? *}, procedure begin end); ) zu sparen.

Ich melde mich sobald ich alles umgebaut habe.
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#18

AW: Record New/Dispose resultiert in MemoryLeaks

  Alt 8. Nov 2017, 01:04
Statt der ThreadId, musst du die Instanz des aufrufenden Threads also Self als Parameter vom Typ TThread übergeben, aber dann sollte es ohne Probleme funktionieren die Funktion auszulagern
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Glados
(Gast)

n/a Beiträge
 
#19

AW: Record New/Dispose resultiert in MemoryLeaks

  Alt 8. Nov 2017, 01:10
Ok danke ich melde mich
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 22:35 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