Google グループは Usenet の新規の投稿と購読のサポートを終了しました。過去のコンテンツは引き続き閲覧できます。
表示しない

プロセスの状態取得

閲覧: 60 回
最初の未読メッセージにスキップ

Kenji Aoki

未読、
2003/12/10 9:52:492003/12/10
To:
あおきと申します。
CreateProcessで外部プログラムを起動し、所定時間、例えば30秒経過した後、
起動したプログラムがまだ終了していない場合、このプロセスを強制終了させ
るようなプログラムを考えています。
 強制終了はTerminateProcessでできそうなんですが、起動したプロセスが終了し
ているかどうか知るにはどうすればいいのでしょうか。
 今はCreateProcessを行ったときのhProcessを記録しておき、所定時間経過後
無条件で(プロセスが生きているかチェックせずに)TerminateProcessしていますが
何となく気持ち悪いので。

 以上お願いいたします。

Takeshi SHIGIHARA

未読、
2003/12/10 21:03:152003/12/10
To:
Kenji Aoki wrote:
>  今はCreateProcessを行ったときのhProcessを記録しておき、所定時間経過後
> 無条件で(プロセスが生きているかチェックせずに)TerminateProcessしていますが

おおよそ、こんな感じになるでしょう。

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 -----

Kenji Aoki

未読、
2003/12/12 18:59:202003/12/12
To:
もと記事青木です。フォローありがとうございます。

"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しています
ので、プログラム終了を待っているわけではなくて問題はないのですが。

Shinji KONO

未読、
2003/12/12 19:20:592003/12/12
To:
河野真治 @ 琉球大学情報工学です。

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,
河野真治 @ 琉球大学工学部情報工学科,

Takeshi SHIGIHARA

未読、
2003/12/12 22:46:242003/12/12
To:
Shinji KONO wrote:
> 河野真治 @ 琉球大学情報工学です。
>
> In article <brdkok$aj$1...@news.mirai.ad.jp>, "Kenji Aoki" <kenji...@nifty.com> writes
>
>> 気になったのですが、この方法ですと所定時間そこに張り付いて他の処理がで
>>きないと言うことはないですか?というのも今回の場合所定時間待つ目的は、そ
>>
>>> r = WaitForSingleObject( pi.hProcess, 30*1000 ) ←ミソ
>
>
> このミソの部分を0にして、polling してやればいいんじゃないでしょうか。
> 僕だったら終了をプロセス間通信で教えるようにすると思う。
>

他に、思いついた順に書いてみます。
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 ------------

Ken Kato

未読、
2003/12/12 22:57:102003/12/12
To:
Kenji Aoki wrote on Sat, 13 Dec 2003 08:59:20 +0900
in article <brdkok$aj$1...@news.mirai.ad.jp>:

その所定時間経過後に、タイムアウト 0 で WaitForSingleObject を実行すれば
張り付くことなくプロセスが終了しているかどうか分かります。


--
Ken Kato (kato....@cij.co.jp)

Ken Kato

未読、
2003/12/12 22:57:422003/12/12
To:
Shinji KONO wrote on 13 Dec 2003 00:20:59 GMT
in article <3989250...@insigna.ie.u-ryukyu.ac.jp>:

>河野真治 @ 琉球大学情報工学です。
>
>In article <brdkok$aj$1...@news.mirai.ad.jp>, "Kenji Aoki" <kenji...@nifty.com> writes
>>  気になったのですが、この方法ですと所定時間そこに張り付いて他の処理がで
>> きないと言うことはないですか?というのも今回の場合所定時間待つ目的は、そ
>> > r = WaitForSingleObject( pi.hProcess, 30*1000 ) ←ミソ
>
>このミソの部分を0にして、polling してやればいいんじゃないでしょうか。
>僕だったら終了をプロセス間通信で教えるようにすると思う。

相手のプロセスも自分が作ったものだったら、ですよね。

--
Ken Kato (kato....@cij.co.jp)

Shinji KONO

未読、
2003/12/13 3:42:102003/12/13
To:
河野真治 @ 琉球大学情報工学です。

In article <bre2m6$4sq$1...@hawaii.ykhm.cij.co.jp>, Ken Kato <kato....@cij.co.jp> writes


> >このミソの部分を0にして、polling してやればいいんじゃないでしょうか。
> >僕だったら終了をプロセス間通信で教えるようにすると思う。
> 相手のプロセスも自分が作ったものだったら、ですよね。

そういう時は、もう一つプロセスをかぶせて、そいつに
見知らぬプロセスの監視をやらせるかな。

Ken Kato

未読、
2003/12/13 5:25:342003/12/13
To:
Shinji KONO wrote on 13 Dec 2003 08:42:10 GMT
in article <3989253...@insigna.ie.u-ryukyu.ac.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)

新着メール 0 件