TApplication元件的OnIdle事件

例子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;

posted @ 2017-09-08 11:12  绿水青山777  阅读(1027)  评论(0编辑  收藏  举报