内部で何が起こっているか見てみましょうApplication.ProcessMessages
。
メイン フォームを閉じると、WindowsWM_QUIT
からプログラムにメッセージが送信されます。の関連部分はTApplication.ProcessMessages
次のようになります。
if Msg.Message <> WM_QUIT then
begin
//skipped
end
else
begin
{$IF DEFINED(CLR)}
if Assigned(FOnShutDown) then FOnShutDown(self);
DoneApplication;
{$IFEND}
FTerminate := True;
end;
これは CLR プログラムではないと思うので、この時点で発生するのは をFTerminate := True
on に設定することだけですApplication
。これは、プロパティに反映されApplication.Terminated
ます。
アプリケーションがシャットダウンするとき、安全にシャットダウンするために行うことの 1 つは、すべてのスレッドが終了するのを待つことです。このコードはたまたまメイン スレッドで実行されていますが、原則はどのスレッドでも同じです。早期に終了する必要がある可能性のある長時間実行されるタスクを実行している場合は、早期終了を明示的に確認する必要があります。
これを知っていれば、コードを修正する方法を簡単に理解できます。
procedure TForm1.Button1Click(Sender: TObject);
var
i: Integer;
begin
for i := 0 to 9999999 do
begin
Memo1.Lines.Add('hi');
Application.ProcessMessages;
if Application.Terminated then
Break;
end;
end;
Application.ProcessMessages
また、アプリケーションのすべてのメッセージを処理するため、そもそも使用に注意してください。何がうまくいかないかを簡単に理解するには、IntToStr(i)
の代わりに'hi'
を追加してみてくださいMemo1.Lines
。カウンターから 2 ~ 3 桁ノックアウトしてから、ボタンを 2 ~ 3 回すばやく連続してクリックし、出力を確認してください。