バックグランド処理
TApplication.OnIdleイベントを処理すると、バックグランド処理を行うことができます。なお、Delphi5ではApplicationEventsコンポーネントを使うことによって、より簡単にこの処理を行うことができます。
OnIdleハンドラはつぎのように定義されます。
type TIdleEvent = procedure (Sender: TObject; var Done: Boolean) of object;
property OnIdle: TIdleEvent
OnIdleハンドラを登録するには
グローバル変数ApplicationのOnIdleプロパティに、自分のフォームのメンバー手続きを代入すれば、その手続きがOnIdleハンドラとなります。
OnIdleハンドラでの処理
OnIdleハンドラは、アプリケーションがマウスやキーの入力待ちのとき呼び出されます。OnIdleハンドラの引数DoneはデフォルトではTrueで、この場合、WaitMessage関数が呼び出され他のプロセスに制御を渡します。DoneをFalseにしてOnIdleハンドラを終了すると、他のプロセスに制御を渡さず、直ちにOnIdleハンドラが再び呼び出されます。
DoneをTrueでOnIdleハンドラを終了したときも、他のプロセスがアイドル状態なら再びOnIdleハンドラが呼び出されます。
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.