[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/05/30(Tue) 18:16
投稿者名:MAKO
Eメール:
URL :
タイトル:
Shell関数の戻り時間に差が・・・
お世話になっております。 また調べても分からない事象が発生したので、
教えて頂きたく、質問させて頂きます。
初心者レベルの質問かもしれませんが、ご了承下さい。

OS:Windows2000
開発:VB6.0

Shell関数を使用して、別のEXE(EXE名を「B」とします。)に起動を掛ける処理があります。
「B」の処理は条件により、処理をする時と、Sleepで20秒程待機する場合があります。

「B」が、処理をする際は、Shellからの戻りが、1秒〜2秒で返ってくるのですが、
「B」が、Sleepをする際、Shellからの戻りが、10秒程度掛かります。

なお、実際のShellで実行する部分は、下記のようになっています。
Call Shell(ディレクトリフルパス & EXE名)

「B」の処理内容は、単純でして。
トリガーファイルが存在すれば、処理を行う。
トリガーファイルが存在しなければ、Sleep20秒し、再度トリガーファイルの存在をチェックしま
す。

Shell関数以外の起動方法がある事は、知っているのですが
「原因追求しなさい」との命令に逆らえません。
知っている方がいらっしゃいましたら、是非教えて下さい。

投稿時間:2006/05/31(Wed) 11:01
投稿者名:Blue
Eメール:
URL :
タイトル:
Re: Shell関数の戻り時間に差が・・・
> 「原因追求しなさい」との命令に逆らえません。
原因は Shell関数 のつくりそのものです。
Shell関数のヘルプにもありますが、
<引用>
メモ
   既定の設定では、Shell 関数はプログラムを非同期的に実行します。
   したがって、Shell 関数を使用して実行を開始したプログラムが終了しなくても、
   Shell 関数の次のステートメントは実行されます。
</引用>
と、非同期実行するとあります。Sleepしないときうまくいっていたのはたまたまなのでは?と思います。


> Shell関数以外の起動方法がある事は、知っているのですが
一番簡単な解決方法は、WScript.ShellオブジェクトのRunメソッドを使うとか。

サンプル)
Sub test1()
    Shell "calc"
    MsgBox "オワ"
End Sub

Sub test2()
    CreateObject("WScript.Shell").Run "calc", 1, True
    MsgBox "オワ"
End Sub

投稿時間:2006/05/31(Wed) 17:06
投稿者名:MAKO
Eメール:
URL :
タイトル:
Re^2: Shell関数の戻り時間に差が・・・
回答ありがとうございます。

なるほど、Shell関数の仕様ですか。。。
「B」のSleep時間に比例して、Shell関数の応答時間が長くなるのが
若干気になりますが・・・「仕様です」と言いきっちゃいます♪

ちなみに、下記は実験結果。(体内時計でカウントしたので誤差ありありですが)
「B」のSleep時間  Shellの応答時間
 2秒        2秒ちょい
 4秒        4秒ちょい
 5秒        5秒ちょい
10秒       10秒ちょい
10秒以上     10秒ちょい ・・・・ここからは、いくらSleepさせても10秒程度
 
> 一番簡単な解決方法は、WScript.ShellオブジェクトのRunメソッドを使うとか。
おぉぉ!なる程、これは簡単ですね♪
ありがとうございます。また武器が一つ出来ました。

投稿時間:2006/05/31(Wed) 19:27
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^3: Shell関数の戻り時間に差が・・・
> 「B」のSleep時間に比例して、Shell関数の応答時間が長くなるのが
> 若干気になりますが・・・「仕様です」と言いきっちゃいます♪

Sleep API の使用は、避けた方が良いかと。
hhttp://www.bcap.co.jp/hanafusa/vbbbs/wforum.cgi?no=6548&reno=6547&oya=6547&mode=msgview&page=0

投稿時間:2006/05/31(Wed) 21:17
投稿者名:Blue
Eメール:
URL :
タイトル:
Re^3: Shell関数の戻り時間に差が・・・
魔界の仮面弁士さんもおっしゃっていますが、アプリBのSleepが悪さをしているとしか
考えれません。
(BがVBでできているとは思わなかったわけで。。。6547で話題になっていましたね。)

ためしに、VB6とVC6でSleepをするEXEを作って、Shell関数で確認したところ
VB側だけ遅延することが確認できました。

# 》 ウィンドウを作成するスレッドでは、Sleep 関数ではなく、MsgWaitForMultipleObjects または
# 》 MsgWaitForMultipleObjectsEx 関数を使ってください。
# より
# VCはコンソールアプリケーションです。
# VBはコンソールアプリケーションっぽく作っても、ウィンドウは生成されてしまうんですね。

追記
実際にMsgWaitForMultipleObjectsを使ってみると、Sleepのような現象は起こりませんでした。

投稿時間:2006/06/01(Thu) 00:03
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: Shell関数の戻り時間に差が・・・
# 脱線

> # VBはコンソールアプリケーションっぽく作っても、ウィンドウは生成されてしまうんですね。

対話モード不許可(App.UnattendedApp = True)モードでコンパイルし、かつ、
リンカパラメータを /SUBSYSTEM:CONSOLE に変更すれば、ThunderRT6Main は生成されないかな。

ちなみに、/SUBSYSTEM:CONSOLE の場合は、FileSystemObject の GetStandardStream()
メソッドで、標準入出力を手軽に扱えたりする…。今回の件とは関係ないけど。

投稿時間:2006/06/02(Fri) 16:47
投稿者名:MAKO
Eメール:
URL :
タイトル:
Re^5: Shell関数の戻り時間に差が・・・
なるほど。 ありがとうございます。
VBでSleepってあまり信用出来ないっぽいですね。
色々調査している時にも、同じような事をおっしゃってるサイトが多数ありました。(^^;)

色々教えて下さいました方々ありがとうございました。

PS:今度は、意味不明な障害が発生してしまいました。
   つきましては、新しくスレッドをあげるので、分かる方、どうか教えて下さい。