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.

Cookies erleichtern die Bereitstellung unserer Dienste. Mit der Nutzung unserer Dienste erklären Sie sich damit einverstanden, dass wir Cookies verwenden.