Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Frage zu "Application.ProcessMessages"


GuaAck - Mo 22.05.17 21:46
Titel: Frage zu "Application.ProcessMessages"
Hallo Experten,

ich möchte mit einem "Start"-Knopf eine laufende Anzeige beginnen und die dann mit einem "Abort"-Knopf wieder anhalten. In der Delphi-Hilfe steht
"Mit der Methode ProcessMessages können Sie die Ausführung einer Anwendung unterbrechen, sodass die Botschaftswarteschlange verarbeitet werden kann."
Aber welche Botschaften (= Messages?) sind das? Im folgenden Code führt ein Drücken des "Abort"-Knopfes jedenfalls nicht dazu, dass BAbortClick ausgeführt wird.

Welche Botschaften werden ausgeführt und was passiert mit den anderen?

(Mit einer Auslagerung der REPEAT...UNTIL-Schleife in einen eigenen Thread ist das Problem behoben.)

Kennt jemand einen gute Quelle, wo ich mal was dazu lesen könnte?

Viele Grüße
GuaAck


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
  TForm1 = CLASS(TForm)
    BStarte: TButton;
    BAbort: TButton;
    PROCEDURE BStarteClick(Sender: TObject);
    PROCEDURE BAbortClick(Sender: TObject);
  PUBLIC
    abort: Boolean;
  END;

PROCEDURE TForm1.BStarteClick(Sender: TObject);
BEGIN
  abort := false;
  REPEAT
    ....
    Application.ProcessMessages;
  UNTIL abort;
END;

PROCEDURE TForm1.BAbortClick(Sender: TObject);
BEGIN
  abort := true;
END;



Moderiert von user profile iconNarses: Topic aus Windows API verschoben am Mo 22.05.2017 um 22:24


Narses - Mo 22.05.17 22:31

Moin!

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
"Mit der Methode ProcessMessages können Sie die Ausführung einer Anwendung unterbrechen, sodass die Botschaftswarteschlange verarbeitet werden kann."
Aber welche Botschaften (= Messages?) sind das?
Alle Nachrichten (=Messages), die in der MessageLoop des Delphi-Hauptprogrammes (=der VCL-Thread) landen, also auch z.B. die Button-Klicks. :nixweiss:

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
Kennt jemand einen gute Quelle, wo ich mal was dazu lesen könnte?
MSDN ist dein Freund [https://msdn.microsoft.com/en-us/library/windows/desktop/ms644928(v=vs.85).aspx]. ;)

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
Im folgenden Code führt ein Drücken des "Abort"-Knopfes jedenfalls nicht dazu, dass BAbortClick ausgeführt wird.
Der Code ist ja nicht vollständig, also kann man schlecht sagen, dass er nicht zum gewünschten Ergebnis führt. Lass mal jegliche anderen Befehle aus der Schleife weg, dann wirst du sehen, dass es funktioniert. :idea: ;)

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
Welche Botschaften werden ausgeführt
Alle, gnadenlos. Das geht sogar soweit, dass ggfs. auch der Button zum Starten erneut ausgeführt wird. :hair:

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
und was passiert mit den anderen?
Da gibt´s keine Selektion, simple Queue.

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
(Mit einer Auslagerung der REPEAT...UNTIL-Schleife in einen eigenen Thread ist das Problem behoben.)
Das hätte ich spätestens jetzt auch empfohlen, denn diese unselige Funktion ist leider ganz weit weg von der sog. "ereignisorientierten Programmierung". :?

cu
Narses


GuaAck - Mo 22.05.17 22:50

Danke Narses,

super-umfassend, alles was ich wissen wollte!!!

Gruß
GuaAck