以上お願いいたします。
おおよそ、こんな感じになるでしょう。
CreateProcess( abc.exe , .... , &pi )
r = WaitForSingleObject( pi.hProcess, 30*1000 ) ←ミソ
switch (r) {
case WAIT_TIMEOUT:
TerminateProcess( pi.hProcess )
break;
case WAIT_OBJECT_0:
GetExitCodeProcess( pi.hProcess, &result ) ←processが返した値が欲しいとき
MessageBox(hwnd, "うまくいったよ", "(^^)", MB_OK);
break;
...
...
}
CloseHandle(pi.hThread)
CloseHandle(pi.hProcess)
WaitForSingleObject, WaitForMultipleObjects, MsgWaitForMultipleObjects
などがありますので、必要に応じて使い分けてください。
----- Takeshi SHIGIHARA
cyg...@tka.att.ne.jp
cyg...@po.jah.ne.jp -----
"Takeshi SHIGIHARA" <cyg...@tka.att.ne.jp> wrote in message
news:<vtfk35s...@news.supernews.com>...
> Kenji Aoki wrote:
> CreateProcess( abc.exe , .... , &pi )
> r = WaitForSingleObject( pi.hProcess, 30*1000 ) ←ミソ
> switch (r) {
> case WAIT_TIMEOUT:
> TerminateProcess( pi.hProcess )
> break;
> case WAIT_OBJECT_0:
> GetExitCodeProcess( pi.hProcess, &result ) ←processが返した値
が欲しいとき
> MessageBox(hwnd, "うまくいったよ", "(^^)", MB_OK);
> break;
> ...
> ...
> }
> CloseHandle(pi.hThread)
> CloseHandle(pi.hProcess)
>
> WaitForSingleObject, WaitForMultipleObjects, MsgWaitForMultipleObjects
> などがありますので、必要に応じて使い分けてください。
気になったのですが、この方法ですと所定時間そこに張り付いて他の処理がで
きないと言うことはないですか?というのも今回の場合所定時間待つ目的は、そ
のプログラムが異常を来して強制終了させることにありますが、異常かどうか判
断するために30秒程度待つことになると思います。この間他の処理がそのまま
というのはまずいので、そこに張り付いてほしくないのです。
今はCreateProcessを行ったときのhProcessを記録しておき、所定時間経過後
無条件で(プロセスが生きているかチェックせずに)TerminateProcessしています
ので、プログラム終了を待っているわけではなくて問題はないのですが。
In article <brdkok$aj$1...@news.mirai.ad.jp>, "Kenji Aoki" <kenji...@nifty.com> writes
> 気になったのですが、この方法ですと所定時間そこに張り付いて他の処理がで
> きないと言うことはないですか?というのも今回の場合所定時間待つ目的は、そ
> > r = WaitForSingleObject( pi.hProcess, 30*1000 ) ←ミソ
このミソの部分を0にして、polling してやればいいんじゃないでしょうか。
僕だったら終了をプロセス間通信で教えるようにすると思う。
---
Shinji KONO @ Information Engineering, University of the Ryukyus,
河野真治 @ 琉球大学工学部情報工学科,
他に、思いついた順に書いてみます。
1) スレッドを起こして30秒間の監視を行わせる
終了したかどうかはeventやらSendMessage/PostMessageで教える。
2) MsgWaitForMultipleObjectsを使う。
メッセージループがやたらと複雑になる欠点がありそうだ。
たとえば受け取った pi.hProcess を記憶しておいて ghProcess として
DWORD r = MsgWaitForMultipleObjects(1, &ghProcess, FALSE, 残り時間, QS_ALLINPUT);
としてみる。 r が WAIT_OBJECT_0+1 ならば普通のウィンドウメッセージだから
普通に処理する。残り時間の部分の処理が面倒になりそうだ。
3) CreateWaitableTimerを使ってみる。
(2)のような残り時間の処理の面倒は無いものの、やっぱりメッセージループが
やっかいそうだ。
4) プロセスを起動した時に SetTimer で30秒を記録しておいて、時間が来たら
WaitForSingleObjectのタイムアウト値を0としてポーリング。タイムアウトなら
まだ生きているとして強制終了処理。
ああ、列記してやっと気が付いた。
(4) が一番簡単そうですね。どうでしょう?
---- Takeshi SHIGIHARA
cyg...@po.jah.ne.jp
cyg...@tka.att.ne.jp ------------
その所定時間経過後に、タイムアウト 0 で WaitForSingleObject を実行すれば
張り付くことなくプロセスが終了しているかどうか分かります。
--
Ken Kato (kato....@cij.co.jp)
相手のプロセスも自分が作ったものだったら、ですよね。
--
Ken Kato (kato....@cij.co.jp)
In article <bre2m6$4sq$1...@hawaii.ykhm.cij.co.jp>, Ken Kato <kato....@cij.co.jp> writes
> >このミソの部分を0にして、polling してやればいいんじゃないでしょうか。
> >僕だったら終了をプロセス間通信で教えるようにすると思う。
> 相手のプロセスも自分が作ったものだったら、ですよね。
そういう時は、もう一つプロセスをかぶせて、そいつに
見知らぬプロセスの監視をやらせるかな。
その程度だったらスレッドで充分では?
--
Ken Kato (kato....@cij.co.jp)