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

実行中のコマンド停止

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

本掲示板には毎回お世話になっております。
本掲示板のTipsで紹介されているpingの発行処理(Ping.exeを使用する方法)で
処理を実装したところ、ping実行中にプロセスを停止するとping.exeが
終了せずにタスクマネージャ上にずっと表示されている事象が発生しています。
(複数の装置に対して発行するため、複数スレッドで実行しています。)


障害時(プロセスアボート等)のことも考えると、対策を実施したいのですが、
実行中のping.exeを停止させる方法はあるのでしょうか?

また障害時のことを考慮した場合、Dispose等に停止処理
を入れるのでしょうか?
(Dispose処理も詳しく理解していないので妥当かどうかもわかっていません。)

もし何かわかる方いましたら、アドバイスして頂けると助かります。
よろしくお願い致します。
プロセスを停止とは、具体的にどういう操作のことを言っているでしょうか?
このとき、停止させたプロセスは確実に終了しているでしょうか?

また、各スレッドはどのように起動したものでしょうか?

それから、残っているping.exeですが、プロセスを停止しなければ多少は時間がかかることはあっても正常に終了するが、
プロセスを停止させるといつまでも終わらないということでしょうか?

あと、ping.exeの起動時に、標準出力先をリダイレクトとかしているでしょうか?
■No26731に返信(なちゃさんの記事)
回答の方ありがとうございます。

> プロセスを停止とは、具体的にどういう操作のことを言っているでしょうか?
> このとき、停止させたプロセスは確実に終了しているでしょうか?
起動フォームに処理を実装していますので、closeを実行した時になります。
(プロセス内で画面は起動フォームのみ)

※ただし、ping処理をクラス化しているので、processクラスがフォームから見えない形になっています。

> また、各スレッドはどのように起動したものでしょうか?
非同期デリゲートを使用してスレッドを立ち上げています。


> それから、残っているping.exeですが、プロセスを停止しなければ多少は時間がかかることはあっても正常に終了するが、
> プロセスを停止させるといつまでも終わらないということでしょうか?
プロセス停止後もタスクマネージャ上を見るとping.exeがずっと残っています。
(数時間待ちましたが、終了していませんでした。)

> あと、ping.exeの起動時に、標準出力先をリダイレクトとかしているでしょうか?
リダイレクトはしていません。


あとプロセス終了時に、processクラスの停止をしていないので、それが原因なので
しょうか?
もしそうであればping処理をクラス化して構築しているので、フォーム側から直接processクラスを開放できないので、クラス側で終了を検地することができればいいのですが・・・
■No26732に返信(zonoさんの記事)
> あとプロセス終了時に、processクラスの停止をしていないので、それが原因なので
> しょうか?
Process を停止させていない事が原因かどうかを確認したいのであれば、
  「ping処理をクラス化して構築したもの」
に、Process を停止させる機能を仮設しておき、それを
(フォーム終了時ではなく)明示的に呼び出してテストしてみては如何でしょう。


> クラス側で終了を検地することができればいいのですが・・・
停止させる方法が分からないというわけではなく、いつ終了させるべきかを
検地…ではなく検知できない事のみが問題なのですね?

であれば、Timer クラスや ErrorProvider クラスのように、
そのクラスをコンポーネント化させては如何でしょう。

(1) そのクラスに System.ComponentModel.Component を継承(Inherits)させる。
(2) Dispose メソッドをオーバーライドして、そこに「終了処理」を記述。
(3) 利用するフォーム側は、以下のように実装。

'Private components As System.ComponentModel.IContainer
'Private foo As 作成したコンポーネント
------------------------------
'以下、Sub New あるいは Load イベント等で
 foo = New 作成したコンポーネント()
 If components Is Nothing Then
  components = New System.ComponentModel.Container()
 End If
 components.Add(foo)

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