AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi TThread: Wie frei geben? Bekomme beim Beenden Memory Leak

TThread: Wie frei geben? Bekomme beim Beenden Memory Leak

Ein Thema von juergen · begonnen am 3. Mai 2020 · letzter Beitrag vom 3. Mai 2020
Antwort Antwort
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
934 Beiträge
 
Delphi 10.3 Rio
 
#1

TThread: Wie frei geben? Bekomme beim Beenden Memory Leak

  Alt 3. Mai 2020, 15:28
Hallo zusammen,

beim starten meines Programms auf einem Client prüfe ich ob die lokale Hilfedatei
a) vorhanden ist
b) die aktuelle Version hat (auf einem Server liegt die aktuelle Hilfedatei)

Da das im Hintergrund laufen soll, habe ich gedacht das in einen eigenen Thread auszuführen, einmalig beim Start.
Funktioniert auch, außer dass nun beim Beenden des Programms ein Memory Leak auftaucht:
Zitat:
---------------------------
Unexpected Memory Leak
---------------------------
An unexpected memory leak has occurred. The unexpected small block leaks are:

53 - 60 bytes: my_HelpFileThread x 1

---------------------------
OK
---------------------------
Der Thread ist eigentlich super einfach:
Delphi-Quellcode:
UNIT u_HelpFileThread;

INTERFACE

USES
  System.Classes, System.IOUtils, System.SysUtils, WinApi.Windows;

TYPE
  my_HelpFileThread = CLASS( TThread )
  PRIVATE
    { Private-Deklarationen }
  VAR
  ls_FileNameAndPath_local, ls_FileNameAndPath_Server: PWideChar;
  PROTECTED
    PROCEDURE Execute; OVERRIDE;

  END;

IMPLEMENTATION


PROCEDURE my_HelpFileThread.Execute;
BEGIN
  TRY
  // hier meine Abarbeitung der Aufgabe
  FINALLY
    Terminate;
  END;
END;
In der Hauptform im OnShow() habe ich folgendes stehen:
Delphi-Quellcode:
...
  u_HelpFileThread.my_HelpFileThread.Create;
...
Ich finde nun keine Möglichkeit meine Thread Klasse freizugeben mit Free oder ähnlichem.

Wie muss man das machen?

Vielen Dank vorab!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)

Geändert von juergen ( 3. Mai 2020 um 22:14 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
7.559 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: TThread: Wie frei geben? Bekomme beim Beenden Memory Leak

  Alt 3. Mai 2020, 15:34
FreeOnTerminate auf True setzen im Konstruktor des Threads genügt schon.

Das darf man aber nur machen, wenn man den erzeugten Thread nur einfach laufen lässt und nicht in einer Variablen hält und darauf zugreift. (Klar, der Thread könnte ja schon freigegeben sein beim Zugriff.)
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
934 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: TThread: Wie frei geben? Bekomme beim Beenden Memory Leak

  Alt 3. Mai 2020, 15:47
Vielen Dank, für meinen Fall passt das!

Allen noch einen schönen Sonntag!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
35.861 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: TThread: Wie frei geben? Bekomme beim Beenden Memory Leak

  Alt 3. Mai 2020, 23:02
Wenn sich dein Programm beendet, dann mußt du auch den Thread beenden,
oder es muß sicherestellt sein, dass er nur kurz läuft und schon vor dem Programmende sich beendet und freigegeben hat.


Man könnte z.B. im Thread aus Application.Terminated prüfen, bzw. dem Thread von außen ein Signal (Thread.Terminate oder ein Event oder eine Variable) schicken
und dann ein bissl warten, bis der Thread aus ist, denn wenn der Thread noch läuft, während der Hauptthread anfängt den Speichermanager aufzuräumen/beenden, dann hast immernoch ein Speicherleck.


Zitat:
Delphi-Quellcode:
PROCEDURE my_HelpFileThread.Execute;
BEGIN
  TRY
  // hier meine Abarbeitung der Aufgabe
  FINALLY
    Terminate;
  END;
END;
Wenn das Execute verlassen wird, ist das automatisch ein Terminate.

Außerdem ist es sinnlos Terminate zu setzen, wenn DU im Execute nie auf Terminated prüfst, denn Terminate macht nichts anderes, als diese Variable zu setzen.

Delphi hat auch beteits ein try-except um das Terminate drumrum aufgebaut, (genauso wie in der VCL um praktisch alle Methoden drumrum)
denn wenn im Windows eine Exception bis zum System durchrauscht, dann wird der komplette Prozess beendet. (du kennst bestimmt auch keinen Entwickler, der niemals eine Exception erzeugt, da wäre das echt blöd)


Einziger Nachteil, dass man nur über OnTerminate oder DoTerminate an diese Exception ran kommt (Property FatalException ist nur dort gesetzt, wenn Execute mit einer Exception abrauchte) und dass Delphi dort den Fehler nicht ausgibt (so wie in der VCL dann der Fehlerdialog kommt) ... sowas müsste man im OnTerminate selbst machen, weil Delphi das leider nicht standardmäßig macht.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
934 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: TThread: Wie frei geben? Bekomme beim Beenden Memory Leak

  Alt 3. Mai 2020, 23:31
@himitsu,

danke für die Hinweise!
Zitat:
Wenn das Execute verlassen wird, ist das automatisch ein Terminate.
Das hatte ich ich auch in der Hilfe gelesen, war dann aber noch ein Überbleibsel aus einigen Versuchen von mir.

Zitat:
Außerdem ist es sinnlos Terminate zu setzen, wenn DU im Execute nie auf Terminated prüfst, denn Terminate macht nichts anderes, als diese Variable zu setzen.
Gut zu wissen!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  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:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf