delphi.gif (306 バイト) バックグランド処理


TApplication.OnIdleイベントを処理すると、バックグランド処理を行うことができます。なお、Delphi5ではApplicationEventsコンポーネントを使うことによって、より簡単にこの処理を行うことができます。

OnIdleハンドラはつぎのように定義されます。

type TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object;
property OnIdle: TIdleEvent

toach.gif (917 バイト) OnIdleハンドラを登録するには

グローバル変数ApplicationのOnIdleプロパティに、自分のフォームのメンバー手続きを代入すれば、その手続きがOnIdleハンドラとなります。

 

toach.gif (917 バイト) OnIdleハンドラでの処理

OnIdleハンドラは、アプリケーションがマウスやキーの入力待ちのとき呼び出されます。OnIdleハンドラの引数DoneはデフォルトではTrueで、この場合、WaitMessage関数が呼び出され他のプロセスに制御を渡します。DoneをFalseにしてOnIdleハンドラを終了すると、他のプロセスに制御を渡さず、直ちにOnIdleハンドラが再び呼び出されます。

DoneをTrueでOnIdleハンドラを終了したときも、他のプロセスがアイドル状態なら再びOnIdleハンドラが呼び出されます。

 

delphi1.gif (322 バイト) OnIdleハンドラの例

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
   { Private 宣言 }
    FCount: Longint;
    procedure OnIdleHandler(Sender: TObject; var Done: Boolean);
  public
   { Public 宣言 }
  end;

var
   Form1: TForm1;

implementation

{$R *.DFM}

// OnIdle ハンドラ
procedure TForm1.OnIdleHandler(Sender: TObject; var Done: Boolean);
begin
    // DoneはデフォルトでTrueで、WaitMessageを呼び出して他のプロセスに制御を渡す。
    // Done := Falseとすると制御を渡さない(この場合、CPU負荷が非常に重くなる)
    Inc(FCount);
    Label1.Caption := 'OnIdle : ' + IntToStr(FCount);
end;

// フォームの初期化
procedure TForm1.FormCreate(Sender: TObject);
begin
  FCount := 0;
  Application.OnIdle := OnIdleHandler;
end;

end.