特定の状況でプログラムがハングする可能性があるという問題があります。タスクマネージャーを使用せずに、Windows呼び出しで独自のプログラムを検索して破棄する方法はありますか。これをプログラム自体に含めることはおそらく意味がありませんが、バンドルされたものとしては誰も見ることができません。
これを行うための最良の方法は何ですか、プログラムを停止するためにどれだけ深く掘り下げる必要があり、OSをクラッシュさせないようにするためにどれだけ浅く保つ必要がありますか?
.batファイルを作成し、そのファイルにTaskkillコマンドを挿入して、アプリケーションを強制的に終了することができます。コマンドは次のようになります。
taskkill /f /im notepad.exe
この関数を使用して、実行中のプロセスを列挙できますEnumProcesses()
。これにより、プロセス名を検索し、PIDを取得できます。TerminateProcess()
PIDを使用すると、ハング したプロセスを強制終了するために呼び出すために必要なプロセスへのハンドルを開くことができます。
MSDNでの使用方法の例があります。EnumProcesses
一部の擬似コードは次のようになります。
EnumProcesses(pidArray, sizeofArray, &bytesReturned);
for(int i=0; i < bytesReturned/sizeof(DWORD); i++) {
if(getProcessName(pidArray[i]) == "ourProcess"){
HANDLE hProc = OpenProcess(PROCESS_TERMINATE, FALSE, pidArray[i]);
TerminateProcess(hProc, 0);
}
}
ハングする状況を修正する必要がありますが、プログラム自体を強制終了する1つの方法は、アプリの起動時に新しいスレッドを生成し、そのスレッドでアプリケーションをポーリングして、必要に応じて強制終了することです。
1つのオプションは、ウォッチドッグとして機能するWindowsサービスを作成することです。プログラムは.exenameで見つけることができます。次に、プログラムがハングするかどうかを判断する方法(たとえば、単純なプロセス間通信やクライアント/サーバーのもの)が必要であり、必要に応じて再起動します。
しかし、それは「誰も見ない」ということではありません。
TerminateProcessを使用してプロセスを終了できます。EnumProcessesを使用してターゲットプロセスIDを決定してから、OpenProcessを呼び出してプロセスのハンドルを取得し、プロセスを終了する必要があります。
sysinternals の pstools から何かを実装するのはどうですか?