HandleMessage:dom
HandleMessage中斷應用程序的執行,以便Windows能夠在將控制權返回給應用程序以前處理來自Windows消息隊列的單個消息。async
若是消息隊列爲空,則HandleMessage生成OnIdle事件並啓動更新應用程序中的操做的過程。ide
注意:若是應用程序空閒,HandleMessage可能須要很長時間才能返回。spa
所以,在等待基於消息的事務時,不要在處理優先級操做時調用HandleMessage。 相反,在處理的不單單是消息時調用ProcessMessages。code
ProcessMessage:orm
ProcessMessages不容許應用程序空閒,而HandleMessage則容許。
blog
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormShow(Sender: TObject); private { Private declarations } procedure MyIdleHandler(Sender: TObject; var Done: Boolean); public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} var { Global variables to show the order of events } XPos, YPos, Delta: integer; procedure StatusMsg( MyForm : TForm1; Canvas : TCanvas; Message : string; Bkg : Boolean); begin if not bkg then Canvas.Font.Style := [fsBold]; {Foreground messages are in bold type. } Canvas.TextOut(XPos, YPos, Message); if not bkg then Canvas.Font.Style := []; { Change Xpos and YPos to prepare for the next message. } Ypos := Ypos + Delta; if YPos >= MyForm.ClientHeight - 10 then begin YPos := 10; Xpos := Xpos + 180; end; if (Xpos >= MyForm.ClientWidth - 100) then begin if (Canvas.Font.Color = clRed) then Canvas.Font.Color := clBlack else Canvas.Font.Color := clRed; Xpos := 10; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Button1.Caption := 'Do not yield'; Button2.Caption := 'Handle Message'; Application.OnIdle:= MyIdleHandler; XPos := 10; YPos := 10; Delta := Abs(Canvas.Font.Height) + 1; end; procedure TForm1.Button1Click(Sender: TObject); var I, J, X, Y: Word; begin StatusMsg( Form1, Canvas, 'The synchronous handler is starting', False); I := 0; J := 0; while I < 10 do begin Randomize; while J < 10 do begin Y := Random(J); Inc(J); end; X := Random(I); Inc(I); end; StatusMsg( Form1, Canvas, 'The synchronous handler is done', False); end; procedure TForm1.Button2Click(Sender: TObject); var I, J, X, Y: Word; begin //同時執行onIdle事件和當前任務 StatusMsg( Form1, Canvas, 'The asynchronous handler is starting', False); I := 0; J := 0; while I < 100 do begin Randomize; while J < 10 do begin Y := Random(J); Inc(J); end; X := Random(I); Inc(I); { yield to OnIdle or other messages } // PostMessage(Handle,WM_PAINT,0,0); 假如消息隊列不是空,則不會生成onIdle事件 Application.HandleMessage; end; StatusMsg( Form1, Canvas, 'The asynchronous handler is done', False); end; procedure TForm1.FormShow(Sender: TObject); begin end; { TForm1 } procedure TForm1.MyIdleHandler(Sender: TObject; var Done: Boolean); begin StatusMsg( Form1, Canvas, 'This represents a background process.', True); end; end.