いいえ、コードは適切ではありません(ただし、99.99%または100%の場合でも機能する可能性があります)。メインスレッドから作業スレッドを終了することを計画している場合は、FreeOnTerminateをTrueに設定しないでください(FreeOnTerminateをTrueに設定することで、上記のコードで何を得ようとしているのかわかりません。少なくともコードが理解しにくくなります) 。
作業スレッドを終了する際のより重要な状況は、作業スレッドが待機状態にあるときにアプリケーションを閉じようとしていることです。Terminateを呼び出すだけではスレッドは起動されません。通常、追加の同期オブジェクト(通常はイベント)を使用して作業スレッドを起動する必要があります。
そしてもう1つの発言-必要はありません
begin
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;
TThread.Destroyコードを見ると、TerminateとWaitForが呼び出されるため、
MyThread.Free;
十分です(少なくともDelphi 2009では、チェックするDelphi 7ソースが手元にありません)。
更新しました
mghieの答えを読んでください。次の状況を考慮してください(1 CPUシステムの方が良い):
メインスレッドが実行されています
procedure TMainForm.Close;
begin
if not MyThreadReady then
begin
MyThread.Terminate;
MyThread.WaitFor;
MyThread.Free;
end;
end;
MyThreadReady値(False)をチェックし、スケジューラーによってオフにされました。
これで、スケジューラーが作業スレッドに切り替わります。実行します
Synchronize(ThreadFinished);
スケジューラーを強制的にメインスレッドに戻します。メインスレッドは実行を継続します:
MyThread.Terminate; // no problem
MyThread.WaitFor; // ???
MyThread.Free;
WaitForで何が起こるかを言うことができますか?答えることはできません(答えるにはTThreadソースを詳しく調べる必要がありますが、一見デッドロックのように見えます)。
あなたの本当のエラーは何か違うものです-あなたは信頼できないコードを書き、それが正しいかどうかを調べようとしています。これはスレッドでは悪い習慣です。代わりに、信頼できるコードを書くことを学ぶ必要があります。
リソースに関しては、TThread(FreeOnTerminate = False)が終了した場合、割り当てられたままのリソースは、Windowsスレッドハンドル(スレッドが終了した後は実質的なWindowsリソースを使用しません)とメモリ内のDelphiTThreadオブジェクトのみです。安全側にいることは大きなコストではありません。