プロが教えるわが家の防犯対策術!

現在、5秒ごとに3箇所をクリックという動作を10分間繰り返すというなスクリプトを組んでいます。
その際に同時進行で残り時間をFUKIDASIで表示させています。
THREADを使うのは今回が初めてなのですが、とりあえず動作はしてくれています。

しかしタイマー部分単体で動かす場合は問題ないのですが、並列処理にするとタイマーにズレが生じてしまいます。
具体的には下記のようなコードで動かすと、残り時間が10秒などの時点でタイマーが終了してしまいます。
BTN部分のクリック待機時間を考えても計算が合いません。
これは何かTHREADの使い方として間違っているのか見落としがあるのでしょうか?

表示位置をずらしただけの同じ秒数のタイマーをTHREADを使うもの、使わないものとで同時にカウントダウンさせた場合はズレもなく、2つとも0秒の時点で終了するので混乱しています。
実際に使用している時は、タイマーが0になる前に次の処理に行くことがわかっているので問題ないと言えば問題ないのですが、原因がわからず気持ち悪いです。
原因や対策がわかる方いらっしゃいましたらよろしくお願いします。

THREAD countdown()

FOR a = 1 to 40  //1セット15秒なので40回で10分
BTN(LEFT,CLICK,50,50,10)
SLEEP(5)
BTN(LEFT,CLICK,250,250,10)
SLEEP(5)
BTN(LEFT,CLICK,500,500,10)
SLEEP(5)
NEXT

PROCEDURE countdown()
FOR b = 600 to 0 step -1
FUKIDASI("残り" + b + "秒",1000,1000)
SLEEP(1.0)
NEXT
FUKIDASI()
SLEEP(0.1)
FEND

A 回答 (1件)

> 現在、5秒ごとに3箇所をクリックという動作を10分間繰り返す



動作を40回繰り返すでなくて、所定の時間処理を行う場合、ForとSleepを組み合わせても、正確な時間で処理するのは難しいです。
短い時間で処理終了するってのは別の原因ですが、例えばBtn処理自体、For~Next処理自体の実行時間とかもあるハズですし。

GetTime()で現在時刻を取得し、現在時刻に対して処理するのが良いです。

--
Public time_end // 終了(予定)時刻

time_end = GetTime() + 10*60 // 終了時刻は現在時刻から10分後

THREAD countdown()

While GetTime() < time_end // 現在時刻<終了時刻の間処理
 // 従来の処理
 Btn(~
 Sleep(~
 ~
Wend
endend

// スレッド
PROCEDURE countdown()
while GetTime() < time_end // 現在時刻<終了時刻の間処理
 Fukidasi("残り" + (time_end-GetTime()) + "秒", ~)
 Sleep(0.5)
Wnnd
Fukidasi()
FEND
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
やはりこの書き方だと正確さに欠けるんですね。
GetTimeでのやり方は次の手として考えていたので、わざわざコードまで書いて下さり、大変助かりました。
早速この方法でやってみた所、問題なく動きました。

>短い時間で処理終了するってのは別の原因

これはどういった原因が考えられますか?
SLEEP以外の処理で時間がかかるのはわかるのですが、その場合はタイマー部分よりも処理時間が長くなるはずなので、逆にタイマーが0になってもすぐに次の処理に行かないのであれば納得できるのですが…。

お礼日時:2017/04/05 17:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています