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

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

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

Re[5]: CreateProcess後画面が消える


(過去ログ 33 を表示中)

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

■16261 / inTopicNo.1)  CreateProcess後画面が消える
  
□投稿者/ nori (9回)-(2008/04/02(Wed) 07:09:04)

分類:[.NET 全般] 

開発環境 VC6.0 OS:Vista
MFCを使って開発をしているのですが、メインフォームからモーダル画面を開いて、そのモーダル画面からCreateProcessで別のEXEを起動しています。この間、モーダル画面ではWaitForSingleObject()でEXEが終了するのを待っているのですが、OSがVistaの場合、終了を待っている間、EXEを起動した側は待機状態で応答なしになっており、EXEが終了すると同時に起動した側のモーダル画面も消えてしまいます。メインフォームをクリックなどすると、再度モーダル画面が表示されるようですが、EXEが終了したときにモーダル画面が消えないようにするにはどうすればよいでしょうか?すみませんがご教授お願いします。
引用返信 編集キー/
■16262 / inTopicNo.2)  Re[1]: CreateProcess後画面が消える
□投稿者/ Azulean (52回)-(2008/04/02(Wed) 07:16:32)
> モーダル画面ではWaitForSingleObject()でEXEが終了するのを待っているのですが、OSがVistaの場合、終了を待っている間、EXEを起動した側は待機状態で応答なしになっており、EXEが終了すると同時に起動した側のモーダル画面も消えてしまいます。
このロジックを見直して下さい。
(タイマーで定期的に見る?)
「応答なし」となっている以上は、ユーザから見ると「フリーズしている」と認識されるでしょうし、再描画が行われず、真っ白になることもあります。

WaitForSingleObjectではそのスレッドが完全に止まります。
他のプロセスが終了するまでといった長い時間を、メインスレッドが待つようなパターンで使わないで下さい。
引用返信 編集キー/
■16263 / inTopicNo.3)  Re[2]: CreateProcess後画面が消える
□投稿者/ nori (10回)-(2008/04/02(Wed) 07:40:53)
No16262 (Azulean さん) に返信
お返事ありがとうございます。

> WaitForSingleObjectではそのスレッドが完全に止まります。
> 他のプロセスが終了するまでといった長い時間を、メインスレッドが待つようなパターンで使わないで下さい。
WaitForSingleObjectは、一定の間隔でタイムアウトを行っており、メインフォームと、EXEを起動している画面については、タイムアウトした間隔で再描画を行っています。この場合、OSがXPや2000だと応答なしにならないようで、Vistaのみ応答なしになってしまいます。やはりタイマーを起動して、定期的にEXEの終了を見るようにしたほうがいいでしょうか?
引用返信 編集キー/
■16265 / inTopicNo.4)  Re[3]: CreateProcess後画面が消える
□投稿者/ Blue (371回)-(2008/04/02(Wed) 11:11:55)
>Vistaのみ
管理者権限とかが絡んでいるとか?

Vistaで
>別のEXE
がふつうに(権限昇格ダイアログがでないか?)起動できるかは試されましたか?

>分類:[.NET 全般]
分類が違っていますね。→C/C++
ただしく選択しないと回答が付きにくくなります。
(VC++6.0は.NETではない。)
引用返信 編集キー/
■16270 / inTopicNo.5)  Re[4]: CreateProcess後画面が消える
□投稿者/ とっちゃん (264回)-(2008/04/02(Wed) 11:40:37)
とっちゃん さんの Web サイト
No16265 (Blue さん) に返信

Vistaの場合のみですが
WaitForSingleObject などの待機系関数を利用するとかなり早い段階で、応答なし状態になります。
具体的にどのくらいの時間か?は計っていませんが、数秒以下(多分1秒もかからず)でその状況に
なるので、APIの呼び出しパラメータを見て状態を切り分けている可能性があります。

Timeout=0の場合は、即座にリターンするので問題はありませんが、そうではない場合その間は
絶対にメッセージを処理しなくなることが、OSレベルで保証できるので
結果として応答しない状態になり、応答なしという表示がなされるのだと思います。

抜本的な対策は、MsgWaitForMultipleObjects を使ったメッセージループにしてそこで待機する
という形になりますが、この場合MFCのコアルーチンにテコ入れすることになるためかなり難易度の高い手術になります。
#なにせ心臓交換ですから...w

割と楽な実装としては、タイマーで定期的にWaitForSingleObject か GetExitCodeProcess を呼び出すかになりますね。

他には、待機処理そのものを別スレッドにしておき、そのスレッドで
終了チェック(こちらは、INFINITE でやっても応答なしにはならない)し、終了が検出できたら
メインスレッド側にメッセージをポストするというやり方もあります。

引用返信 編集キー/
■16342 / inTopicNo.6)  Re[4]: CreateProcess後画面が消える
□投稿者/ nori (11回)-(2008/04/03(Thu) 07:14:56)
No16265 (Blue さん) に返信
コメントありがとうございます。

> >Vistaのみ
> 管理者権限とかが絡んでいるとか?
>
> Vistaで
> >別のEXE
> がふつうに(権限昇格ダイアログがでないか?)起動できるかは試されましたか?
別のEXEは権限昇格ダイアログは出ずにふつうに起動できました。
現象については、別EXEが終了したときに発生するようです。

> >分類:[.NET 全般]
> 分類が違っていますね。→C/C++
> ただしく選択しないと回答が付きにくくなります。
> (VC++6.0は.NETではない。)
すみません、次から気をつけます。

引用返信 編集キー/
■16343 / inTopicNo.7)  Re[5]: CreateProcess後画面が消える
□投稿者/ nori (12回)-(2008/04/03(Thu) 07:34:28)
No16270 (とっちゃん さん) に返信
コメントありがとうございます。

> 他には、待機処理そのものを別スレッドにしておき、そのスレッドで
> 終了チェック(こちらは、INFINITE でやっても応答なしにはならない)し、終了が検出できたら
> メインスレッド側にメッセージをポストするというやり方もあります。
待機処理は、別スレッドで行い、そのスレッドで別EXEの終了を待つのがよいようですね。
Vistaの場合では、待機処理で短い時間でも応答なしになるようですね。勉強になりました。
引用返信 編集キー/
■16462 / inTopicNo.8)  Re[5]: CreateProcess後画面が消える
□投稿者/ nori (13回)-(2008/04/06(Sun) 18:47:43)
No16342 (nori さん) に返信
> ■No16265 (Blue さん) に返信
> コメントありがとうございます。
>
>>>Vistaのみ
>>管理者権限とかが絡んでいるとか?
>>
>>Vistaで
>>>別のEXE
>>がふつうに(権限昇格ダイアログがでないか?)起動できるかは試されましたか?
> 別のEXEは権限昇格ダイアログは出ずにふつうに起動できました。
> 現象については、別EXEが終了したときに発生するようです。
>
>>>分類:[.NET 全般]
>>分類が違っていますね。→C/C++
>>ただしく選択しないと回答が付きにくくなります。
>>(VC++6.0は.NETではない。)
> すみません、次から気をつけます。
>
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -