Hallo,
vielen Dank euch Beiden für die Rückmeldungen.
Die Tools TiGü belegen direkt, dass meine alte Version tatsächlich mit den
GDI-Handels nach oben geht. Zwar "nur" ca. 10 pro Minuten, aber mit entsprechend langer Laufzeit führt das unweigerlich zu der o.g.
Exception.
Der ProcessExplorer von Rolf ist ja auch von Sysinternals und bekommt das bestimmt auch hin. Danke auch Dir für diesen Tip.
Bzgl. der Exceptions:
Manchmal sieht man echt den Wald vor lauter Bäumen nicht. Ich war bis dato -weshalb auch immer- der Meinung, dass alle Exceptions, die nicht unmittelbar mit try..except abgefangen werden, an das
GUI eskaliert werden: deshalb fange ich an jeder möglichen Stelle eben genau dies so ab. try..finally war für mich bis dato die unnützeste Funktion in ganz Delphi, weil: alles, was nach einer
Exception gemacht werden muss, schreibe ich einfach nach try..except, denn "diese Zeile wird ja auch nach der
Exception ausgeführt".
In meinem Beispielcode müsste -in genau dieser Konstellation- myBitmap stets freigegeben werden, da alle vorherigen Exceptions (ja: unnötig oft) abgefangen und zumindest mit Logbuch behandelt werden. Zwar kann FreeAndNil(myBitmap) hier nur aufgerufen werden, wenn dieses vorher "Assigned()" war, aber wenn es nicht assigned war, muss es ja auch nicht freigegeben werden, oder? Ich will hier nicht in den Krümeln suchen, nur der Vollständigkeit halber helft mir bitte es zu verstehen, falls ich hier falsch liege. Rolfs Variante ist unabhängig davon die Bessere, die ich auch zukünftig verwenden werde.
Die Kritik an meinem ReleaseDC ist zu 100% berechtigt.
Deinen Ansatz, Rolf, mit try..finally *umgeben* von try..except habe ich mir eben mir einer kleinen Demo reingezogen:
Delphi-Quellcode:
procedure TfrmDemo1.Button1Click(Sender: TObject);
var
tmp: TButton;
begin
try
try
tmp := NIL;
tmp.Click;
finally
ShowMessage('finally');
end;
ShowMessage('2');
except
ShowMessage('except');
end;
end;
Dadurch, dass die
Exception *nicht* ans
GUI eskaliert wird (das dachte ich früher wohl nur, weil ich damals try..finally nicht von try..except nochmal umgeben hatte, und es in diesem Fall tatsächlich ans
GUI ging), sondern erst die Finally behandlung stattfindet und *dann* die
Exception-Behandlung ist das natürlich des wesentlich bessere Weg. Es ist immer wieder erschreckend, dass auch nach so vielen Jahren Delphi-Erfahrung solche Grundlagen erst tatsächlich "verstanden" werden. Schämschäm. Aber besser spät als nie.
Danke nochmal!
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit