フォームを最小化したときにループ処理を休ませるには?

解決


?  2008-08-26 23:48:48  No: 31656

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%の
ままであり、スリープしていないようです。
最小化時にスリープをはさむことは可能でしょうか?


igy  2008-08-27 00:54:25  No: 31657

if (Form1.WindowState <> wsMinimized) then
  begin
    (CPU使用率100%のループ処理が入ります)
  end;

のような処理では、ダメですか?


?  2008-08-27 01:29:50  No: 31658

返信ありがとうございます。
igyさんにご指摘していただいた方法を試してみましたが、
CPU使用率が100%になってしまいました。
ならば、ということで

  procedure TForm1.ApplicationEvents1Minimize(Sender: TObject);
  begin
    Sleep(1);
  end;

と記述して実行しても、やはり100%になってしまいます。


ttt  2008-08-27 02:09:50  No: 31659

最小化しててもメインフォームのWindowStateはwsNormalのままになりますね。
ApplicationのOnMinimizeをつかまえてみたらどうでしょうか?
……と思ったらすでにAppEventsを使ってやっているようですが
最小化した瞬間だけSleepしても意味がないので、フラグ立てるなりしないと駄目ですね。


?  2008-08-27 02:50:16  No: 31660

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さん、ありがとうございました。


?  2008-08-27 02:52:28  No: 31661

解決しました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加