同一线程中各事件间的同步问题
wyj 2000-02-23 03:59:00 最近遇到一个问题,简化为下面的这段代码:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls,Syncobjs;
const
MyMessage=WM_USER+200;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
private
Aborted:Boolean;
procedure HandleMessageLoop(var Mes:TMessage); Message MyMessage;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
PostMessage(Form1.Handle,MyMessage,0,0);
end;
procedure TForm1.HandleMessageLoop(var Mes:TMessage);
var
i:Integer;
begin
if Mes.Msg=MyMessage then
begin
i:=1;
Aborted:=False;
while (i<=800) and (not Aborted) do
begin
Label1.Caption:=IntToStr(i);
Label1.Update;
Application.ProcessMessages;
Inc(i);
end;
end
else
Inherited;
end;
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
Aborted:=True;
CanClose:=True;
end;
end.
简单来讲,Button1的功能是发消息,而HandleMessageLoop专用于处理这个消息。
由于按钮按下的时刻不可预见,就会造成HandleMessageLoop函数的重入,假如这个函数正在做比较重要的事情,就会造成混乱。
请问有什么较好的办法可能避免HandleMessageLooop函数在执行过程中被重入,如果不使用线程的话?