Application.ProcessMessages を入れてもアプリを終了できない

解決


もいか  2021-04-13 21:19:16  No: 149656

いつもお世話になっています。

時間のかかる処理で、途中に Application.ProcessMessages を入れて
任意のタイミングでアプリを終了できるようにしたいのですが、
終了させることが出来ませんでした。

上記を簡単化したコードが以下となります。

procedure TForm1.Button1Click(Sender: TObject);
var
  i : integer;
begin
  i := 0;
  while True do
  begin
    sleep(1000); // 時間のかかる処理
    Application.ProcessMessages;

    Memo1.Lines.Add(i.ToString);
    i := i + 1;
  end;
end;

上記のプログラムの Button1Click を実行した後に
画面右上のバッテンを押してアプリの終了を試みたのですが
終了しませんでした。

画面右上のバッテンで終了させる方法は無いでしょうか?

こちらの環境は以下となります。
・Windows 10 Pro バージョン 2004
・Delphi 10.3 Update 3

よろしくお願いいたします。


  2021-04-14 06:00:02  No: 149657

抜けるための条件をつけてはいかがですか。
onclorequeryイベントで、処理を抜けるためのフラグをonにして、そこではまだフォームを閉じず、上のループを正常に抜けた後にpost Messageでwm_closeをformに送るような感じではないかと思いました。
処理が終わっていないのに強制終了させようとするのは、非常時なら良いかもしれませんが、あまりよい振る舞いとは思えませんでした。


もいか  2021-04-14 09:36:27  No: 149658

あ さん
返信ありがとうございます。
なるほど、いろいろなサンプルに処理を抜けるためのフラグが入っていたのはそのためだったのですね。
全く気がついていませんでした。ありがとうございます。
フラグを使った実装を検討します。

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


Mr.XRAY  2021-04-16 23:01:05  No: 149659

> 画面右上のバッテンで終了させる方法は無いでしょうか?

procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
  TerminateProcess( GetCurrentProcess, 0);
end;

とすると閉じることはますが,実務では TerminateProcess はあまりお勧めできません.


Mr.XRAY  2021-04-16 23:04:16  No: 149660

> とすると閉じることはますが,
とすると閉じることができますが,


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








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