Einzelnen Beitrag anzeigen

berens

Registriert seit: 3. Sep 2004
431 Beiträge
 
Delphi 2010 Professional
 
#4

AW: EOutOfResources - Wie viele Handles sind noch verfügbar?

  Alt 19. Dez 2019, 16:05
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
  Mit Zitat antworten Zitat