ApplicationEventsコンポーネントを使って、
procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
(CPU使用率100%のループ処理が入ります)
//アプリケーションが非アクティブになったらスリープ
if (Application.Active = False) then Sleep(1);
//フォームを最小化したらスリープ
if (Form1.WindowState = wsMinimized) then Sleep(1);
end;
と記述して実行してみたところ、非アクティブ状態ではCPU使用率が
5%程度になるのですが、フォームを最小化してもCPU使用率が100%の
ままであり、スリープしていないようです。
最小化時にスリープをはさむことは可能でしょうか?
if (Form1.WindowState <> wsMinimized) then
begin
(CPU使用率100%のループ処理が入ります)
end;
のような処理では、ダメですか?
返信ありがとうございます。
igyさんにご指摘していただいた方法を試してみましたが、
CPU使用率が100%になってしまいました。
ならば、ということで
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
Sleep(1);
end;
と記述して実行しても、やはり100%になってしまいます。
最小化しててもメインフォームのWindowStateはwsNormalのままになりますね。
ApplicationのOnMinimizeをつかまえてみたらどうでしょうか?
……と思ったらすでにAppEventsを使ってやっているようですが
最小化した瞬間だけSleepしても意味がないので、フラグ立てるなりしないと駄目ですね。
tttさんの助言に従い、予めisMinimizedというBooleanを定義して、
procedure TForm1.ApplicationEvents1Idle(Sender: TObject;
var Done: Boolean);
begin
(CPU使用率100%のループ処理が入ります)
//アプリケーションが非アクティブになったらスリープ
if (Application.Active = False) then Sleep(1);
//フォームを最小化したらスリープ
if (isMinimized = True) then Sleep(1);
end;
procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
begin
isMinimized:=True;
end;
procedure TForm1.ApplicationEvents1Restore(Sender: TObject);
begin
isMinimized:=False;
end;
と記述して実行したところ、無事最小化したときスリープが入るようになりました。
助言してくださったtttさん、igyさん、ありがとうございました。
解決しました。
ありがとうございました。
ツイート | ![]() |