DOBON.NET DOBON.NETプログラミング掲示板過去ログ

プロセス終了について

環境/言語:[VS2003 Windows XP]
分類:[.NET]

本掲示板には大変お世話になっております。

プロセスを終了させる方法についてお聞きしたいのですが、
プロセスを終了させる方法としてProcessクラスkillメソッドと
CloseMainWindowメソッドがありますが、killメソッドだと
終了対象のプロセスの状況にかかわらず強制終了しますが、
CloseMainWindowはクローズメッセージを送るだけとマニュアルには
記述されています。
CloseMainWindowメソッドをコールしたとき、終了対象のプロセスは
何のイベントで検地すればいいのでしょうか?

今回実現したいことは、終了対象のプロセスにCloseMainWindowなど
終了させるイベントを発行し、終了対象のプロセスはイベントを検地し
Enviroment.Exitで終了コードを返却することです。
なのでCloseMainWindowにこだわらず終了対象のプロセスにイベントが
通知できればよいのですが、今回はプロセス間通信(メッセージキューなど)
の実装は考えていません。

※プロセスの起動と終了以外に通信をする目的がないためです。

何か実現方法がありましたら教えていただけると助かります。
よろしくお願いいたします。
CloseMainWindow では、普通に FormClosing / FormClosed や Application.Exit イベントが発生します。
CloseReason には TaskManagerClosing が設定されるみたいですね。

送信側・受信側両方を好きに出来るのなら、名前付きイベント(.NET では EventWaitHandle として実装されています)を使うのが個人的には一番楽で融通が利くと思います。

ところで、Process.Exited イベント時点では終了したプロセスの情報が収集しきれないことがあるようです。Exited イベント内でさらに WaitForExit によって待機した方が安全かも知れません。
http://social.msdn.microsoft.com/Forums/ja-JP/csharpgeneralja/thread/eb62e572-c98c-4136-bcd5-1ab52a62c666
// ExitCode だけなら大丈夫かもしれませんが。

> CloseMainWindow では、普通に FormClosing / FormClosed や Application.Exit イベントが発生します。
> CloseReason には TaskManagerClosing が設定されるみたいですね。
検証した結果、CloseMainWindowではFormClosingイベントやFormClosedでイベント捕獲することができました。


> 送信側・受信側両方を好きに出来るのなら、名前付きイベント(.NET では EventWaitHandle として実装されています)を使うのが個人的には一番楽で融通が利くと思います。
名前付きイベント(EventWaitHandle)とはどういった処理なのでしょうか?
融通が利くのであればこちらを採用したいと思っていますが、プロセス間で
イベントのやりとりができるのでしょうか?
できれば簡易的なサンプル等を教えて頂けるとたすかります。

よろしくお願い致します。
> 融通が利くのであればこちらを採用したいと思っていますが、プロセス間で
> イベントのやりとりができるのでしょうか?
プロセス間で同じイベントを扱うための「名前つき」です。名前を使ってイベントオブジェクトを共有します。
ただし、ちゃんと使うにはマルチスレッドに関する知識が必要です。
サンプルとかは EventWaitHandle で検索すればいくらでもヒットします。
■No25831に返信(Hongliangさんの記事)
>>融通が利くのであればこちらを採用したいと思っていますが、プロセス間で
>>イベントのやりとりができるのでしょうか?
> プロセス間で同じイベントを扱うための「名前つき」です。名前を使ってイベントオブジェクトを共有します。
> ただし、ちゃんと使うにはマルチスレッドに関する知識が必要です。
> サンプルとかは EventWaitHandle で検索すればいくらでもヒットします。

Honglian様返信の方ありがとうございます。
EventWaitHandleを調べたところ、.NetFrameWork2.0から導入されたクラス
でしたので、今回の開発環境(VS2003)では使用することができないです。

ということは、CloseMainWindowしか方法はないのでしょうか?
CloseMainWindowで実現するとなるとFormClosing、FormClosed、Application.Exitでイベントを検地するしか簡易な方法としてはないのかなと思っています。



> EventWaitHandleを調べたところ、.NetFrameWork2.0から導入されたクラス
> でしたので、今回の開発環境(VS2003)では使用することができないです。
ああ、すいません見落としていました。確かにその通りですね。
Win32API の CreateEvent を直接呼び出す手もありますけど。

他にマネージの範囲内でとなると .NET リモーティング辺りかしら。
仕組みがいささか大がかりですが。
■No25838に返信(Hongliangさんの記事)
>>EventWaitHandleを調べたところ、.NetFrameWork2.0から導入されたクラス
>>でしたので、今回の開発環境(VS2003)では使用することができないです。
> ああ、すいません見落としていました。確かにその通りですね。
> Win32API の CreateEvent を直接呼び出す手もありますけど。
>
> 他にマネージの範囲内でとなると .NET リモーティング辺りかしら。
> 仕組みがいささか大がかりですが。

Hongliang様返信の方ありがとうございます。
実装については、CloseMainWindowで検討したいと思います。

あと追加でお聞きしたいのですが、プロセスを起動する時に
ProcessクラスのStartメソッドをコールして起動しているのですが、
プロセスがフリーズとはせずに無事に起動したことを確認することはできるのでしょうか?

何かありましたら教えて頂けると助かります。
よろしくお願い致します。
> あと追加でお聞きしたいのですが、プロセスを起動する時に
> ProcessクラスのStartメソッドをコールして起動しているのですが、
> プロセスがフリーズとはせずに無事に起動したことを確認することはできるのでしょうか?

フリーズって言うのは、自分自身ではなく Process.Start で新しく起動したプロセスの話ですか?
何をもってフリーズというのか、定義が曖昧なのでなんとも言えません。
Process.Start の返値、Id プロパティ、WaitForInput メソッドなどが使えるかも知れません。

DOBON.NET | プログラミング道 | プログラミング掲示板