- 締切済み
UWSC 無限ループ
UWSCで A.uws と B.uwsを無限ループさせたくて // 無限ループ While True Call A.uws // xxxx.uws 記録保存したスクリプト名 Call B.uws // xxxx.uws 記録保存したスクリプト名 Wend と記述したのですが、A.uwsは読み込まれたのですがB.uwsが読み込まれません。 具体的に、どこがどうおかしいか、このスクリプトでは出来ない場合、実際に両方を無限ループさせたい場合どう記述すれば良いのか教えて下さい。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- neKo_quatre
- ベストアンサー率44% (736/1639)
> Windowsの仕様上A.uwsとB.uwsをA.uwsがSleep数千秒してる間にB.uwsを実行すると言うことが、出来ないと言うことですね。 いえ、違います。 全く別の話です。 > A.uwsがSleep数千秒してる間にB.uwsを実行 UWSCで実行するなら、Threadを使ってください。 それでA.UWSとB.UWS(の中の関数)は同時に実行できます。 ですが、クリックの操作は理論上同時に行ったとしても、Windowsが受け取った順序でしか処理されないってことです。 あるいは、A.uwsで何らかの操作を行っている時にB.uwsで別の操作を始めると、A.uwsの操作が中断されたり、誤操作になる可能性があります。 なので、Threadを使うってのはよっぽど特殊な場合です。 -- 普通は、AとBを交互に実行とか、必要に応じてAとBのいずれかを実行とかで事足ります。 例えば、 ・Aは20秒後に開始して40秒ごとに実行 ・Bは30秒後に開始して35秒ごとに実行 とかなら、 timer_A=GetTime()+20 timer_B=GetTime()+30 While True t=GetTime() if timer_A<=t then // Aの実行時刻? Call A.uws timer_A=GetTime()+40 // 次回Aの実行時刻は40秒後 elseif timer_B<=t then // Bの実行時刻? Call B.uws timer_B=GetTime()+35 // 次回Bの実行時刻は35秒後 else Sleep(0.5) // 0.5秒待機 endif Wend とか。 複数の関数を実行するタイミングの調整を行うのに、sleepは向いてないです。
- neKo_quatre
- ベストアンサー率44% (736/1639)
> この場合、A.uwsが終わった後にB.uwsに移るのでしょうか? そうなります。 デバッガでステップ実行、Printでログを確認して、どこで止まってるのか?ループしてるのか、確認するのが確実では。 > 実際の動作は、A.uwsとB.uwsを時間差で同時に動かしたいのです。 同時に2箇所をクリックするのでなければ、交互に動かすのと等価でしょう。 プロセス分けて同時にクリックしようとしたって、従来のWindowsでは先着のイベント順に処理されるだけですし。
お礼
>従来のWindowsでは先着のイベント順に処理されるだけですし Windowsの仕様上A.uwsとB.uwsをA.uwsがSleep数千秒してる間にB.uwsを実行すると言うことが、出来ないと言うことですね。 あくまでA.uwsの後にB.uwsと言うことですね。
- neKo_quatre
- ベストアンサー率44% (736/1639)
A.uwsの中身はどうなっていますか? A.uwsの中で無限ループしいればCallされた所に戻りません。 A.uwsの中でExitExitで直ちにプログラム終了していれば、そこで処理中断してCallされた所に戻りません。 取りあえず、 -----A.uws----- MsgBox("A.uws") Exit -----B.uws----- MsgBox("B.uws") Exit の内容なら、問題なく交互に呼び出されます。
お礼
回答ありがとうございます A.uwsの中身は、座標クリックとスリープだけです。 この場合、A.uwsが終わった後にB.uwsに移るのでしょうか? 実際の動作は、A.uwsとB.uwsを時間差で同時に動かしたいのです。
お礼
説明を見てる限りですと、私がやろうとしていることは簡単なコマンドでは行けそうにないと感じました。 どうもありがとうございました。