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

コマンドの監視について

環境/言語:[VB.NET(VS2003) windowsXP]
分類:[.NET]

本掲示板にはいつもお世話になっております。

現在Processクラスを使用して、コマンドを発行し、
実行したコマンドをリダイレクト指定して結果を得る処理を作成しています。
(http://dobon.net/vb/dotnet/process/standardoutput.htmlを参考にさせて頂きました。)

コマンドを発行後、一定時間監視して終了しないようであれば
強制終了したいため、WaitForExitで一定時間監視し、戻り値が
Falseであれば対象ProcessをKillする処理を作成したのですが、
ReadToEndで処理が完了するまでWaitForExitがコールされないため
WaitForExitの監視処理がまったく意味を成していません・

WaitForExitとReadToEndの処理を逆にするとデットロックを
起こす可能性があるとのことなのでどのように監視処理を入れるか
困っています。

WaitForExitの処理は諦めて、タイマークラス等を使用して別に監視するか
ないのでしょうか?

もし何かいい対策がありましたら教えて頂けると助かります。
よろしくお願い致します。
■No27061に返信(zonoさんの記事)

ProcessクラスにはOutputDataReceivedやExitedなどのイベントがありますので、これらを使ってみるという方法はいかがでしょうか?
■No27063に返信(管理人さんの記事)
> ■No27061に返信(zonoさんの記事)
>
> ProcessクラスにはOutputDataReceivedやExitedなどのイベントがありますので、これらを使ってみるという方法はいかがでしょうか?

管理人様
返信の方ありがとうございます。

OutputDataReceivedは2.0以降で追加されたイベントなので現状実装することは
できません。(VS2003であるため)

Exitedイベントでは、処理終了時のイベントを検知できますが、
監視については、やはりタイマークラスを使用して実装することに
なりますでしょうか?(WaitForExitの処理は廃止)
■No27065に返信(zonoさんの記事)

> OutputDataReceivedは2.0以降で追加されたイベントなので現状実装することは
> できません。(VS2003であるため)

見逃していました。申し訳ありませんでした。

> Exitedイベントでは、処理終了時のイベントを検知できますが、
> 監視については、やはりタイマークラスを使用して実装することに
> なりますでしょうか?(WaitForExitの処理は廃止)

タイマーでもできますし、MSDNのProcess.Exitedイベントのサンプルのような感じでもできそうですね。

Process.Exited イベント (System.Diagnostics)
http://msdn.microsoft.com/ja-jp/library/system.diagnostics.process.exited(VS.80).aspx

ただしMSDNのサンプルはコンソールアプリケーションでSynchronizingObjectプロパティが設定されていませんが、Windowsアプリケーションの場合はSynchronizingObjectプロパティにフォームを設定するか、フォームデザイナでフォームに配置したProcessコンポーネントを使用したほうが安全です。
管理人様

回答が遅れてしまい申し訳ございません。
教えて頂いた結果を元に、色々検証してみたところ、
結局、Exitedイベントは発行いない方向で考えています。

@Process.startの前にタイマーを起動し、監視処理を実行する。
A監視処理実行後はそのままリダイレクト処理を行う。
Bタイマーが満了し、Processが起動中の場合はkillを発行する。
※タイマーの満了有無を問わず処理が終了したらタイマーを停止する。

上記の手順で実装したらうまくいっています。
もし上記の手順で問題があれば指摘して頂けると助かりますが、
状況としては解決済みとさせて頂きます。

色々と教えて頂いてありがとうございました。
解決済み!

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