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

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

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

Re[14]: WaitForSingleObjectリターンしたのに実行中


(過去ログ 18 を表示中)

[トピック内 23 記事 (1 - 20 表示)]  << 0 | 1 >>

■6961 / inTopicNo.1)  WaitForSingleObjectリターンしたのに実行中
  
□投稿者/ ふせっち (1回)-(2007/08/28(Tue) 09:14:36)

分類:[Windows 全般] 

2007/08/28(Tue) 09:25:24 編集(投稿者)

WaitForSingleObjectを使用して終了待ちを行っているのですが、
待っているアプリケーションがまだ終了していないのに
リターンコードが帰ってきてしまいます。
これは、なぜでしょうか?
また、このリターンは正常値(WAIT_OBJECT_0)でななく
「1」です。
この値の意味も分かりません。

よろしくお願いいたします。

引用返信 編集キー/
■6963 / inTopicNo.2)  Re[1]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ れい (76回)-(2007/08/28(Tue) 09:32:03)
No6961 (ふせっち さん) に返信
> WaitForSingleObjectを使用して終了待ちを行っているのですが、
> 待っているアプリケーションがまだ終了していないのに
> リターンコードが帰ってきてしまいます。
> これは、なぜでしょうか?
> また、このリターンは正常値(WAIT_OBJECT_0)でななく
> 「1」です。

-1ではなく、1ですか?
WaitForSingleObjectで1が戻るのは聞いたこと無いですが。

とりあえず、GetLastErrorとかを調べてみたらどうでしょう?

引用返信 編集キー/
■6968 / inTopicNo.3)  Re[2]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ ふせっち (3回)-(2007/08/28(Tue) 09:57:13)
No6963 (れい さん) に返信
> -1ではなく、1ですか?
はい。
CStrで戻り値を表示しているのですが確かに「1」です。

> とりあえず、GetLastErrorとかを調べてみたらどうでしょう?
この事象は商用で発生し、試験環境では再現せず
困っているところです。
引用返信 編集キー/
■6969 / inTopicNo.4)  Re[3]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ Blue (339回)-(2007/08/28(Tue) 10:25:47)
No6968 (ふせっち さん) に返信
> CStrで
ということはVB?

状況がよくわからないのですが、対象としているアプリ自体はC++で作っていて、
それをVB6かなにかで動かしているということでしょうか?


それと、他の掲示板でも聞くのであれば、それをちゃんと書いておきましょう。
http://hpcgi1.nifty.com/MADIA/ccbbs/wwwlng.cgi?print+200708/07080004.txt

また、別の掲示板で〜とアドバイスをもらったとかそういう報告を逐一しましょう。
同じ回答がついてしまう可能性があり回答者側に無駄なことをさせてしまいます。
引用返信 編集キー/
■6970 / inTopicNo.5)  Re[4]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ ふせっち (4回)-(2007/08/28(Tue) 11:15:28)
No6969 (Blue さん) に返信
> ということはVB?

VBScriptで呼び出しています。

> それと、他の掲示板でも聞くのであれば、それをちゃんと書いておきましょう。
> http://hpcgi1.nifty.com/MADIA/ccbbs/wwwlng.cgi?print+200708/07080004.txt

大変申し訳ございませんでした。
こちらに集約する旨を記載いたしました。

上記サイトで教えていただいたところで、以下の文言があり、
少々気になるので教えてください。
http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/jpdllpro/html/_win32_waitforsingleobject.asp

-- ここから
この待機関数と、ウィンドウを直接的または間接的に作成するコードを組み合わせて使う場合は、注意が必要です。
-- ここまで

プログラムの中でシグナル状態を待っているのは
createProcessによって実行されたバッチプログラム(xxx.bat)から呼び出される
javaアプリケーションです。
このバッチプログラム(xxx.bat)でCMDプロンプトが起動し、
このウィンドウスタイルを指定しています。
これは、上記の文言に当てはまりますでしょうか?

また同サイトの以下の文言

-- ここから
メッセージのブロードキャスト(同報送信)が発生した場合、システム内のすべてのウィンドウへそのメッセージが送信されます。
-- ここまで

上記で、システム内のすべてのウィンドウへのブロードキャストは
どのようなものが考えられるのでしょうか?
また、実際にこの状態にするには、どうしたらよいのでしょうか?



引用返信 編集キー/
■6975 / inTopicNo.6)  Re[5]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ 魔界の仮面弁士 (388回)-(2007/08/28(Tue) 11:55:17)
No6970 (ふせっち さん) に返信
>>ということはVB?
> VBScriptで呼び出しています。

WaitForSingleObject って、API ですよね。

VBScript は Declare ステートメントをサポートしていないので、
API は呼び出せないはずですが… DynaCall 等を併用しているのでしょうか?
引用返信 編集キー/
■6976 / inTopicNo.7)  Re[6]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ ふせっち (5回)-(2007/08/28(Tue) 12:02:15)
No6975 (魔界の仮面弁士 さん) に返信

> WaitForSingleObject って、API ですよね。
>
> VBScript は Declare ステートメントをサポートしていないので、
> API は呼び出せないはずですが… DynaCall 等を併用しているのでしょうか?

WshShellオブジェクトを取得してRunしています。
引用返信 編集キー/
■6978 / inTopicNo.8)  Re[7]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ 魔界の仮面弁士 (389回)-(2007/08/28(Tue) 12:15:29)
No6976 (ふせっち さん) に返信
>>WaitForSingleObject って、API ですよね。
>>VBScript は Declare ステートメントをサポートしていないので、
>>API は呼び出せないはずですが… DynaCall 等を併用しているのでしょうか?
> WshShellオブジェクトを取得してRunしています。

WshShell.Run で exe を起動する事はできますけれど…… API の直接実行はできませんよね?


呼び出した exe に、WaitForSingleObject API を実行させているのでしょうか。
そうだとしたら、その戻り値は、どのような方法で VBScript 側に引き渡していますか?
引用返信 編集キー/
■6980 / inTopicNo.9)  Re[8]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ ふせっち (6回)-(2007/08/28(Tue) 12:33:24)
No6978 (魔界の仮面弁士 さん) に返信
> WshShell.Run で exe を起動する事はできますけれど…… API の直接実行はできませんよね?

すみません。書き方が悪かったです。おっしゃる通り、
Runでexe(C++)を実行し、その中でWaitForSingleObject を実行しています。

> そうだとしたら、その戻り値は、どのような方法で VBScript 側に引き渡していますか?

まずはexeでのリターン値として取得し、
その後「ByRef」としてまた参照渡しされ、そこでCStrで表示しています。
引用返信 編集キー/
■6981 / inTopicNo.10)  Re[8]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ Hongliang (176回)-(2007/08/28(Tue) 12:37:25)
Hongliang さんの Web サイト
Run ってことは、引数で終了待機指定してるだけとか?
で、1 はその実行プログラムの返値。

どうにも VBScript と bat と Javaアプリケーションとプログラムの相関がつかめない。
引用返信 編集キー/
■6982 / inTopicNo.11)  Re[9]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ Blue (340回)-(2007/08/28(Tue) 12:50:24)
> Runでexe(C++)を実行し、その中でWaitForSingleObject を実行しています。
実行される側でWaitForSingleObjectをして終わったかどうか確かめる??

呼び出し側でやんないと意味ないのでは?
終了まで待機するのであれば Run の引数の bWaitOnReturn をTrueにするだけでよいのでは?

<引用>
bWaitOnReturn
省略可能です。スクリプト内の次のステートメントに進まずにプログラムの実行が終了するまでスクリプトを待機させるかどうかを示す
ブール値です。bWaitOnReturn に TRUE を指定すると、プログラムの実行が終了するまでスクリプトの実行は中断され、Run メソッドは
アプリケーションから返される任意のエラー コードを返します。bWaitOnReturn に FALSE を指定すると、プログラムが開始すると Run
メソッドは即座に復帰して自動的に 0 を返します (これをエラー コードとして解釈しないでください)。
</引用>
引用返信 編集キー/
■6983 / inTopicNo.12)  Re[9]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ 魔界の仮面弁士 (390回)-(2007/08/28(Tue) 13:02:01)
No6980 (ふせっち さん) に返信
> まずはexeでのリターン値として取得し、
> その後「ByRef」としてまた参照渡しされ、そこでCStrで表示しています。

値を ByRef で渡す? どこからどこに?
それぞれの処理の流れがわからないので、話がどうにも見えてきません……。

そもそも、VBScript 側で終了待機をするのであれば、WshShell.Run の第 3 引数に True を指定するだけなので、
WaitForSingleObject の出番はないと思いますし、逆に、WaitForSingleObject の問題なのであれば、
それは C++ 側だけで完結する話であって、VBScript 側に問題が波及することは無いように思うのですけれども。
引用返信 編集キー/
■6984 / inTopicNo.13)  Re[9]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ ふせっち (7回)-(2007/08/28(Tue) 13:05:03)
No6981 (Hongliang さん) に返信
> Run ってことは、引数で終了待機指定してるだけとか?
> で、1 はその実行プログラムの返値。
>
「WaitForSingleObject 」の戻り値をリターンしています。

> どうにも VBScript と bat と Javaアプリケーションとプログラムの相関がつかめない。

ちょっと作りが複雑で(と言うより煩雑で)
シーケンスは
wsf → wsf → exe → bat(*1) → bat(*2) → java
        ↑
        ここで*1のシグナル待ち

一つ目のwsfでByRef指定で2つ目のwsfを呼び出し、
二つ目のwsfでRunによりexeを実行し、
exeはbatプロセスをCreateProcessで作成・実行して
それが終わるのを「WaitForSingleObject 」で待ち
「WaitForSingleObject 」のリターンを呼出もとのwsfに返す。
このリターン値は1つ目のByRef指定に設定される。

と言うものです。

batとjavaの関係は、*1が*2を単に呼び、
*2の中でjavaコマンド(java abcClass args1 な感じの)を
書いてjavaを起動させているだけです。

複雑ですみません。

で、なぜかjavaアプリケーションは終了していないのに
「WaitForSingleObject」で「1」で戻ってきてしまい
悩んでいるところです。
戻ってきたということは、bat(*1)は終了していると言うことだと思うのですが、
このbatだけをどうしたら終了させることが出来るのか。。。
と、さらに悩んでいるところです。
引用返信 編集キー/
■6985 / inTopicNo.14)  Re[10]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ Blue (341回)-(2007/08/28(Tue) 13:11:45)
C++のアプリ内で実行したものが終わったかどうかをVBScriptで判定したいということでしょうか?

だったら、今のつくり(ただexeをキックするだけ)のままで不可能では?
Runではすべてが終わったかしか判定できないので。
(というか、スレッドで動くことが出来ないからスクリプトでは無理っぽそう。)
引用返信 編集キー/
■6986 / inTopicNo.15)  Re[10]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ ふせっち (8回)-(2007/08/28(Tue) 13:15:19)
No6983 (魔界の仮面弁士 さん) に返信

> そもそも、VBScript 側で終了待機をするのであれば、WshShell.Run の第 3 引数に True を指定するだけなので、
> WaitForSingleObject の出番はないと思いますし、逆に、WaitForSingleObject の問題なのであれば、
> それは C++ 側だけで完結する話であって、VBScript 側に問題が波及することは無いように思うのですけれども。

そうなのです。
最初の質問の通り、いま一番知りたいのは
「WaitForSingleObject」は、対象のスレッドが終了しないでもリターンしてしまうのか?
また、戻り値「1」ってナンだ?
と言うことなのです。

VBScriptなどいろいろなものが介在しているのは
既にあるフレームワークでそういう作りになっている!
と言うことなのです。

すみません。はじめにこういうことだと記載しておけば良かったです(反省)
皆さんよろしくお願いいたします

引用返信 編集キー/
■6987 / inTopicNo.16)  Re[11]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ ふせっち (9回)-(2007/08/28(Tue) 13:24:09)
No6985 (Blue さん) に返信
> C++のアプリ内で実行したものが終わったかどうかをVBScriptで判定したいということでしょうか?

はい。
しかし、厳密に言うと、終わったかどうかを判定すると言うよりは
終わったならとりあえず正常に終わったの?
的な感じで、
単に、各Javaアプリケーションの実行の入り口になっているのがこのC++アプリ
と言うことです。
フレームワークにより、他のところでタイムアウトもチェックしていますし。

> だったら、今のつくり(ただexeをキックするだけ)のままで不可能では?
> Runではすべてが終わったかしか判定できないので。
> (というか、スレッドで動くことが出来ないからスクリプトでは無理っぽそう。)

exeでは「WaitForSingleObject」のリターン値を受け取り、
後処理をして正常に終了し元に戻ってくるので
> Runではすべてが終わったかしか判定できないので。
でOKかと思います。
引用返信 編集キー/
■6988 / inTopicNo.17)  Re[12]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ Blue (342回)-(2007/08/28(Tue) 13:37:26)
勘違いしていました。

exe起動

バッチ実行

バッチ終了→VBSに通知

exe終了

かと思っていました。

とりあえず、スクリプトにもとったときの値ではなく、実際にWaitForSingleObjectを
使っているところつまりC++のexeの中ではどんな値になっているのか確認してみてはどうでしょうか?
引用返信 編集キー/
■6989 / inTopicNo.18)  Re[11]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ 魔界の仮面弁士 (391回)-(2007/08/28(Tue) 13:48:16)
No6986 (ふせっち さん) に返信
> 「WaitForSingleObject」は、対象のスレッドが終了しないでもリターンしてしまうのか?
アプリケーションの終了という話が出ていたので、「プロセス」を監視していたのだと
思ったのですが、実際に監視しているのは「スレッド」だったのでしょうか?


> また、戻り値「1」ってナンだ?
> と言うことなのです。

幾つか確認させてください。


(1) その C++ アプリから、何か別のアプリケーションを起動していますか?
 起動させている場合、それは同期実行でしょうか。非同期実行でしょうか。


(2) 戻り値「1」とは、VBScript 上ではなく、C++ アプリ上で取得・確認したものですよね?
 WshShell.Run で得られる ExitCode(ERRORLEVEL) と API の戻り値は、直接は関係が無いはずなので、
 VBScript 側で得られる情報を提示されても、問題の切り分けができません。


(3) そもそも、WaitForSingleObject で、いったい何を監視させているのでしょうか?
 プロセスなのか、スレッドなのか、それとも他のシグナルなのか。


(4) 使用している API は、間違いなく WaitForSingleObject なのでしょうか?
 MsgWaitForMultipleObjects(Ex) であれば、「1」を返す可能性もありますが、
 WaitForSingleObject の場合は、下記の「いずれか」が返される仕様のはずなので。
   0x00000000L : WAIT_OBJECT_0
   0x00000080L : WAIT_ABANDONED
   0x00000102L : WAIT_TIMEOUT
引用返信 編集キー/
■6992 / inTopicNo.19)  Re[12]: WaitForSingleObjectリターンしたのに実行中
□投稿者/ れい (77回)-(2007/08/28(Tue) 14:40:19)
No6989 (魔界の仮面弁士 さん) に返信
>  WaitForSingleObject の場合は、下記の「いずれか」が返される仕様のはずなので。
>    0x00000000L : WAIT_OBJECT_0
>    0x00000080L : WAIT_ABANDONED
>    0x00000102L : WAIT_TIMEOUT

0xFFFFFFFF : WAIT_FAILED

の可能性も。
引用返信 編集キー/
■6998 / inTopicNo.20)  Re[12]: WaitForSingleObjectリターンしたのに実行中
 
□投稿者/ ふせっち (10回)-(2007/08/28(Tue) 15:53:57)
No6989 (魔界の仮面弁士 さん) に返信
> アプリケーションの終了という話が出ていたので、「プロセス」を監視していたのだと
> 思ったのですが、実際に監視しているのは「スレッド」だったのでしょうか?

すみません。プロセスです。

> (1) その C++ アプリから、何か別のアプリケーションを起動していますか?
>  起動させている場合、それは同期実行でしょうか。非同期実行でしょうか。
>
いいえ。起動していません。

> (2) 戻り値「1」とは、VBScript 上ではなく、C++ アプリ上で取得・確認したものですよね?
>  WshShell.Run で得られる ExitCode(ERRORLEVEL) と API の戻り値は、直接は関係が無いはずなので、
>  VBScript 側で得られる情報を提示されても、問題の切り分けができません。

★これは、私の確認ミスでした(ごめんなさいごめんなさい↓↓)。
「WAIT_OBJECT_0」で戻ったときのプロセスの
「GetExitCodeProcess」の値と考えられました。
「考えられる」としたのは、やはりまだプロセスは終わっていないからです。
もしかしたら、待機中にC++自体が異常終了!ってことも考えられる!?
でも、戻り値となる変数は「0」で初期化しているし。。。

やはり行きつくところは、
なぜプロセスが終わっていないのに帰ってくるのか。

> (3) そもそも、WaitForSingleObject で、いったい何を監視させているのでしょうか?
>  プロセスなのか、スレッドなのか、それとも他のシグナルなのか。
>
プロセスです。
>
> (4) 使用している API は、間違いなく WaitForSingleObject なのでしょうか?

間違いなく「WaitForSingleObject」です。
引用返信 編集キー/

次の20件>
トピック内ページ移動 / << 0 | 1 >>

管理者用

- Child Tree -