Application.HandleMessage與Application.ProcessMessage

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.
View Code
相關文章
相關標籤/搜索