例子1 测试 时,CPU并没有占用100% 不知道是否Delphi高版本已优化。
声明:Property OnIdle:TIdleEvent;
其中:TIdleEvent是这样声明的:
TIdleEvent=Procedure(Sender:TObject;Var Done:Boolean) of Object;
这个事件发生在系统空闲的时候,例如程序在等待用户输入,这时候
我们可以完成一些后台的工作,如加载数据库信息、处理图片等。
当参数Done为True时,事件句柄完成后,除非应用程序又处理过一个
消息,而该消息对列到现在又清空了,否则该事件不会被激活;如果
将Done设为False,在应用程序等待消息时,该事件将被连续激活。
由于在执行OnIdle事件句柄时,应用程序不会响应外部事件,因此,
尽可能保证过程简短,或大量使用ProcessMessage调用。
举一个例子:
我们在程序的状态栏上显示时间,你可以不必做一个定时器去刷新状
态栏,只要响应OnIdle事件,在程序空闲的时候做这个事情就可以了。
程序如下:
Procedure TForm1.DisplayTime(Sender:TObject;Var Done:Boolean);
begin
StatusBar1.Panels[0].Text:=TimeToStr(Now);
Done:=False;
end;
Procedure TForm1.FormCreate(Sender:TObject);
begin
Application.OnIdle:=DisplayTime;
end:
Procedure TForm1.FormClose(Sender:TObject;Var Action:TCloseAction);
begin
Application.OnIdle:=Nil;
end;
在上例中,将Done设为False,所以在状态栏上能够实时显示时间,如果
将其设True,则只要没有产生消息,状态栏上的时间不会改变,直到移
动鼠标或是按下键等,状态栏上时间才会刷新,这就是Done参数的作用。
执行以上程序时,如果打开“系统监视器”,你会发现CPU的使用率是
100%,这是因为系统所有的空闲时间都用来在你的状态栏上显示时间。
OnIdle最好的用处在于后台装载数据库,比如我在编写一个数据库应用
时,由于在Form的Create事件中要打开好几个数据库,因此程序启动要
等待片刻,为此还要做一个启动画面,后来我就使用了OnIdle事件,在
Form的Create事件中并不打开数据库,而是在OnIdle事件中打开,这样
程序的启动大大加快,示范如下:
Procedure TForm1.OpenDataBase(Sender:TObject;Var Done:Boolean);
begin
try
//Open DataBase;
finally
Application.OnIdle:=Nil;
//不管是否打开数据库,必须中止OnIdle事件
//否则由于各种原因导致数据库打不开数据库
//的话,将导致系统锁死。
end;
end;
Procedure TForm1.Create(Sender:TObject);
begin
Application.OnIdle:=OpenDataBase;
end;