Entwickler-Ecke

Windows API - Application.MessageHandle oder Application.ProcessMessages


Heiko - Mi 21.09.05 20:13
Titel: Application.MessageHandle oder Application.ProcessMessages
Wo merkt man eigentlich den Unterschied bei Programmen zw. Application.MessageHandle und Application.ProcessMessages? Das MessageHandle soll ja eigentlich eher für zeitintensive Processe sein als ProcessMessages, aber ich merke keinen Unterschied. Ich hatte gehofft das er vlt. noch weiterarbeitet wenn ich MessageHandle nehme, während das Fenster verschoben ist ohne einen extra Thread zu nehmen. (der Befehl wird nur aller 250ms aufgerufen, so das eigentlich das verschieben stocken müsste, wenn er nur kurz reagiert). Wo liegt spürbar ein Unterschied zw. den beiden Befehlen?


Motzi - Mi 21.09.05 21:09

Du meinst wohl HandleMessage... der Unterschied ist einfach der, dass HandleMessage (wie der Name schon sagt) nur eine Message verarbeitet, während ProcessMessages alle in der Message-Queue wartenden Messages verarbeitet.


BenBE - Mi 21.09.05 21:16

Weiterhin (und sogar noch wichtiger) behandelt HandleMessage IMMER genau eine Nachricht (und wartet extra auf eine solche wenn nötig). ProcessMessages begnügt sich auch mit Nixtun.


Heiko - Do 22.09.05 06:22

Ist es nicht nachteilig, wenn bei zeitintensiven Programmen er auf eine Message wartet, anstatt einfach weiterzumachen, wenn er merkt das keine da ist?


BenBE - Do 29.12.05 15:44

Daher hab ich noch niemanden gesehen, der bei Zeitintensiven Dingen HandleMessage einsetzt ...


DavidKlimas - Sa 14.04.07 14:57
Titel: Processmessages + OnMessage
Ich schliesse hier mal an die unterhaltung an.
Ich hab in meinem Programm eine (fast endlos) Schleife mit einem ProcessMessages eintrag. Ein Label mit MouseLeave-Procedure soll die schleife beenden, doch nichts passiert, da MouseLeave keine "Message" erstellt, die von ProcessMessage erkannt werden Würde. Was tun?


Heiko - Sa 14.04.07 15:04

Ich habe gerade mal geguckt. Das OnLeave-Ereignis wird auch durch messages ausgelöst:


Delphi-Quelltext
1:
2:
3:
4:
  TControl = class(TComponent)
  private
    ...
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;

Der Fehler dürfte bei dir also woanders liegen.


DavidKlimas - Sa 14.04.07 15:25

Hier ein kleines vereinfachtes Beispiel :


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
procedure TForm1.StartButtonClick(Sender: TObject);
begin
  While Image1.left > 0 do
  begin
    Image1.Left := Image1.Left + 1;
    application.ProcessMessages;
  end;
  ShowMessage('Nothing');
end;

procedure TForm1.EndLabelMouseLeave(Sender: TObject);
begin
  Image1.Left := 0;
end;


Die Nachricht 'Nothing' wird nie gezeigt.