Delphi/C++ Builder アプリケーションで自分自身を強制終了

アプリケーションを終了させようとすると、何かのスレッドが生きたままなんかで、終了できない事がある。モチロン、その原因を探り、正しく終了させるのがよいのだけど、どっかで入手したネットワークコンポーネントなんかが返ってこないパターンもあったりする

一定時間待って、終了できなかったら別スレッドから自分自身を強制終了するスレッドオブジェクト

終了時
TTerminateThread.Create(False);
みたいに記述しておけば、下記の場合4秒後に強制終了する

unit TerminateUtil;
interface

uses
    Classes, Windows;

type
    TTerminateThread = class(TThread)
    protected
        procedure Execute; override;
    end;

implementation

{ TTerminateThread }

procedure TTerminateThread.Execute;
var hProcess: THandle;
begin
    FreeOnTerminate := True;
    Sleep(4000);

    hProcess := OpenProcess(PROCESS_TERMINATE, False, GetCurrentProcessId());
    if (hProcess <> 0) then begin
        try
            TerminateProcess(hProcess, 0);
        finally
            CloseHandle(hProcess);
        end;
    end;
end;

end.

コメント