GUI アプリケーションによって実行されるコンソール デーモンがあります。GUI アプリケーションが終了したら、デーモンも停止したいと思います。
Windowsで穏やかに行うにはどうすればよいですか?
Linux では、SIGTERM を使用するだけですが、ウィンドウにコンソール アプリケーション用の同様のメカニズムはありますか?
もう少し詳しく説明すると、デーモン アプリは Python で作成され、GUI は C# および Windows フォームで作成されています。
Windows には、あなたが考えているような信号はありません。
(偽の) SIGTERM と SIGBREAK がコンソール アプリによって処理される方法を変更するためのインフラストラクチャがいくつかありますが、ほとんどSetConsoleCtrlHandler
の場合GenerateConsoleCtrlEvent
、両方ともコンソール アプリケーション自体でのみ使用されます。外からではありません。
Windows コンソール アプリが SIGTERM を受け取ったときに行うことはすべて callExitProcess
であり、特別なことではないことに注意してください。私は python の同等物が何と呼ばれているかについて 100% ではありませんが、標準的な「終了」呼び出しは同等である必要があります。
コンソール アプリにシグナルを送って、ExitProcess
それ自体を呼び出すコードを作成することをお勧めします。それができない場合は、TerminateProcess
(同等のProcess.Kill ) を使用して外部からコンソール プロセスを閉じます。を「偽造」しようとするExitProcess
ことは、MSDN の記事に記載されている理由から危険です。
「優しい」と定義してください:)
デーモンと GUI の間に通信メカニズムが既に存在すると仮定しています。「終了」コマンドを導入して送信するだけです。
デーモンが何かで忙しい (またはフリーズしている) 場合でも、デーモンを強制終了したい場合は、TerminateProcess() を使用します。
両方を最大限に活用するには、「quit」を送信してから、プロセス ハンドルをしばらく待ちます (WaitForSingleObject())。デーモン プロセスがたとえば 5 秒以内に終了しない場合は、終了します。
デーモンのメイン スレッドが長時間ビジー状態になる傾向がある場合は、指定されたイベントを待つだけのバックグラウンド スレッドをデーモンに開始させます。そのスレッドにシグナルを送るには、GUI から名前でイベントを開き、それを発生させます。イベント検出時に何をするかはデーモン次第ですが、少なくとも制御されたシャットダウンになります。