C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

呼び出したプロセスの生死確認 /awazon (20/02/05(Wed) 16:50) #93802
Re[1]: 呼び出したプロセスの生死確認 /魔界の仮面弁士 (20/02/05(Wed) 17:02) #93803
  └ Re[2]: 呼び出したプロセスの生死確認 /ぶなっぷ (20/02/06(Thu) 10:21) #93807


親記事 / ▼[ 93803 ]
■93802 / 親階層)  呼び出したプロセスの生死確認
□投稿者/ awazon (1回)-(2020/02/05(Wed) 16:50:36)

分類:[VB.NET/VB2005 以降] 

VB2013・Windows10

WinFormのバックグラウンド処理で、以下のように別プロセスを呼び出すことがあります。

Dim p As Process = Process.Start()
p.WaitForExit()
Dim ret As Integer = p.ExitCode

ただ、呼び出したプロセスが何らかの理由でコケてた場合、
ExitCodeすら返ってこない場合があります。
その場合、p.WaitForExit()の所で処理が止まってしまいます。

おそらく、非同期でプロセスを呼び出せばいいのでしょうけれど、
その場合、プロセスのExit検知はUIスレッド側で受け取ることになるでしょうか?
また、呼び出したプロセスの生死を判断することは可能でしょうか?
(例えばタイマー等で定期的にプロセスの生死状態を確認する、等)

よろしくお願いします。
[ □ Tree ] 返信 編集キー/

▲[ 93802 ] / ▼[ 93807 ]
■93803 / 1階層)  Re[1]: 呼び出したプロセスの生死確認
□投稿者/ 魔界の仮面弁士 (2553回)-(2020/02/05(Wed) 17:02:33)
No93802 (awazon さん) に返信
> ただ、呼び出したプロセスが何らかの理由でコケてた場合、

再現テストはしていないのですが、そのコケる場合において、
Process の変数を WithEvents で宣言しておいたときに
Exited イベントを捕らえることはできますか?

WithEvents なフィールド変数では都合が悪い場合は、
Shared な Start メソッドの代わりに、
インスタンスメンバーの Start メソッドを試してみてください。
https://dobon.net/vb/dotnet/process/openfile.html#exited


> その場合、p.WaitForExit()の所で処理が止まってしまいます。
WaitForExit() の代わりに
WaitForExit(milliseconds) を使ってみるのはどうでしょう。
[ 親 93802 / □ Tree ] 返信 編集キー/

▲[ 93803 ] / 返信無し
■93807 / 2階層)  Re[2]: 呼び出したプロセスの生死確認
□投稿者/ ぶなっぷ (217回)-(2020/02/06(Thu) 10:21:32)
2020/02/06(Thu) 10:28:50 編集(投稿者)
> その場合、p.WaitForExit()の所で処理が止まってしまいます。
p.WaitForExit()で止まっているときに、タスクマネージャで見ると、
対象のタスクは消えていますか?
消えていないなら、それが原因です。

以下、その状況だと仮定してのアドバイスです。
プロセスは終了しているように見えているからこその、今回の質問だと思います
ので、プロセスがタスクバーから消えている状態で、プロセスが生き残っている
と思われます。

そんなことが起きる状況ですが、
終了処理の最中、メインウィンドウは非表示となって、例外発生のために、
プロセスが残ってしまったとかはあり得そうな話です。

一度、以下のような方法で例外をキャッチしてみてはどうでしょう?
  https://dobon.net/vb/dotnet/programing/unhandledexception.html

例外の場所をきちんと把握して、処置すれば、プロセスは正常に終了すると思わ
れます。

最悪、処置不能な例外なら、例外ハンドラから、プロセスを終了させてしまえば、
p.WaitForExit() を抜けてくるはずです。

[ 親 93802 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -