www.delphientwickler.de

Du bist Delphientwickler und suchst nach Projekten?

 

Sie suchen eine Firma zur Unterstützung oder Betreuung Ihres Delphi Projektes?
Klicken Sie hier!

Memory Leaks in Delphi

Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!, 17.08.2017

Rad Studio 10.2.1.png

In Release 1 von Delphi 10.2 Tokyo tritt ein Problem bei Windows FireMonkey-Anwendungen auf. Im Quality Portal wurde hier von Memory Leaks in den entsprechenden Anwendungen berichtet. Ebenso hier auf Stackoverflow.

Das Problem liegt daran, dass die an Thread.CurrentThread.ForceQueue weitergegeben Callbacks in TStyledControl.KillResourceLink nicht ausgeführt werden können, weil die Anwendung geschlossen wird, bevor ein Thread diese behandeln kann. Der TThread-Klassendestruktor zerstört die Liste, die immer noch die unbehandelten Callbacks enthält. Vermutlich finden die Memory Leaks nicht während der Ausführung, sondern bei Beenden des Programms statt.

Stefan Glienke, der auch die Ursache des Problems fand, schlägt eine recht einfache Abhilfslösung vor: Durch das Aufrufen von CheckSynchonize aus System.Classes wartet die Anwendung auf die Ausführung der Cleanup Threads. Dabei wird eine kurze Synchronisierung bei kaum merkbarer Verzögerung ausgeführt.

Der entsprechende Code kann an verschiedene Stellen gesetzt werden. Der einfachste Platz dafür ist der finalization-Block im Hauptformular. Mit aktiviertem Memory-Leak-Reporting kann es folgendermaßen aussehen:

initialization
  ReportMemoryLeaksOnShutdown := true;

finalization
  CheckSynchronize;

Alternativ kann die Änderung auch in der dpr-Projektdatei vorgenommen werden. Dazu müssen System.SysUtils und System.Classes den Uses hinzugefügt werden. Der Code kann so aussehen:

uses
  System.StartUpCopy,
  System.SysUtils,
  System.Classes,
  FMX.Forms,
  ...
  ;

{$R *.res}
procedure DoneApplication;
begin
  CheckSynchronize;
end;

begin
  AddExitProc(DoneApplication);
  Application.Initialize;
  ...;
  Application.Run;

Mit CheckSynchronize kann dieses Problem zunächst behelfsweise behoben werden, bis ein offizieller Fix veröffentlicht wird.

Wir benutzen Cookies

Wir nutzen Cookies auf unserer Website. Einige von ihnen sind essenziell für den Betrieb der Seite, während andere uns helfen, diese Website und die Nutzererfahrung zu verbessern (Tracking Cookies). Sie können selbst entscheiden, ob Sie die Cookies zulassen möchten. Bitte beachten Sie, dass bei einer Ablehnung womöglich nicht mehr alle Funktionalitäten der Seite zur Verfügung stehen.