In einem anderen Beitrag ging es kürzlich darum, während einer langen Programmschleife gelegentlich Application.ProcessMessages() aufzurufen, damit das Programmfenster weiterhin reagiert.
Ein Problem ist dann die Ablauf-Reihenfolge, wenn nämlich der User während einer Schleife ungeduldig auf Buttons klickt, und dann ein ProcessMessages() aus einer Schleife anfängt auf die User-Clicks zu reagieren und andere Abläufe einschiebt.
Wenn's blöd läuft, beeinflussen sich die nun ineinander verschachtelten Abläufe gegenseitig - und wenn's ganz schlecht läuft, blockieren sie sich sogar gegenseitig (Deadlock).
Dies betrifft jedoch nur Fensteranwendungen, und genau darin liegt ein weiteres Problem: Das Application-Objekt ist in Konsolenprogrammen gar nicht verfügbar, weil dann LCL/Forms nicht verfügbar ist.
Somit kann man nicht einfach in jede allgemeine Unit beliebig Application.ProcessMessages() einbauen, wenn die Unit auch in Konsolenprogrammen genutzt werden soll.
Deshalb habe ich mir Folgendes ausgedacht:
Code: Alles auswählen
var
ProcessMessages_Explicit_Counter: Integer = 0;
procedure ProcessMessages_Explicit();
begin
{$IFDEF LCL} // Achtung: existiert nur in fpc, nicht in Delphi
inc(ProcessMessages_Explicit_Counter);
try
Application.ProcessMessages();
finally
dec(ProcessMessages_Explicit_Counter);
end;
{$ENDIF}
end;
Was Wort _Explicit soll verdeutlichen, dass es keine Nachrichten-Verarbeitung aus Idle ist, sondern ein expliziter Aufruf aus dem Programmcode.
Außerdem erhöht der Aufruf die Zählvariable ProcessMessages_Explicit_Counter, die man in der Oberfläche auswerten kann, z.B. bei Click oder in Timer-Events, die lieber nichts Neues starten sollen, solange noch eine andere Schleife läuft.
Code: Alles auswählen
procedure TForm1.Button1Click(Sender: TObject);
begin
if ProcessMessages_Explicit_Counter > 0 then begin Beep; Exit; end;
...
end;Ein Problem habe ich jedoch: Den Compiler-Wert LCL gibt es in Delphi nicht. Die VCL setzt keinen Wert VCL oder ähnlich. Wie könnte man eine Delphi-kompatible Weiche umsetzen?
Grüße, Jörg