• 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;

  • 相关阅读:
    线程私有数据
    C
    Zend_Json 简介 --(手冊)
    Spring之AOP实现面向切面编程
    JDBC框架
    NYOJ15-括号匹配(二)-区间DP
    SDUTOJ 贪心 -商人小鑫
    Java 8 类型转换及改进
    java内存结构(执行时数据区域)
    Android Studio 编译Gradle提示编码错误
  • 原文地址:https://www.cnblogs.com/maweiwei/p/7493614.html
Copyright © 2020-2023  润新知