アプリ版:「スタンプのみでお礼する」機能のリリースについて

UWSCについてです。

私は、UWSCをまだ1週間ほどしか触っていない超初心者です。
下記のようなプログラミングを組みたいと思っているので、プログラミング初挑戦なので右も左も良く分かっていません。
UWSCのプログラミングに詳しい方助けてください。

私の組みたいプログラミングは

("A.BMP",0)を無制限ループしつつ、("B.BMP",0)は2時間おきにループしつつ、("C.BMP",0)を30分間に30回実行する
場合のプログラミングです。【3つ同時進行です。】

宜しくお願いします。

while True

ifb CHKIMG("A.BMP",0)

x=G_IMG_X // 画像の座標をxへ代入
y=G_IMG_Y // 画像の座標をyへ代入

BTN(LEFT, CLICK, x, y, 80)

endif

ifb CHKIMG("B.BMP",0)

x=G_IMG_X // 画像の座標をxへ代入
y=G_IMG_Y // 画像の座標をyへ代入

BTN(LEFT, CLICK, x, y, 80)

endif

ifb CHKIMG("C.BMP",0)

x=G_IMG_X // 画像の座標をxへ代入
y=G_IMG_Y // 画像の座標をyへ代入

BTN(LEFT, CLICK, x, y, 80)

endif

wend

A 回答 (3件)

Aの処理回数が非常に多く、取りこぼしを防ぐ(BやCを処理中にAを見逃すようなケース)


タイマーやらを使うのも別にいいんですが、ループ中に無駄にIf文を通過します。
無駄に通過する=重い で余計に判定や処理しそこなう可能性が高いです。

なのでthreadを使う。
Aのチェックが0.1秒毎でもこれならそんな重くは無いです。
さらに
 「CHKIMGで画面全体から画像を探す」という状態を
 「指定した範囲内で画像を探す」ように変更すればもっと軽くなります。

また、下記サンプルではBTN関数でCLICKからDOWN、UPに変更しています。
おそらくブラウザゲーのマクロなんでしょう、Clickだとミスする確率が非常に高いです


Thread スレッド用処理("A.BMP",5)
Thread スレッド用処理("B.BMP",7200)
Thread スレッド用処理("C.BMP",1800)
WHILE 1
 SLEEP (1)
WEND


// 引数:画像ファイル,処理タイミング(秒)
procedure スレッド用処理(画像,rest)
 // 無限ループ
 while 1
  ifb CHKIMG(画像,0) then
   //x=G_IMG_X // 画像の座標をxへ代入
   //y=G_IMG_Y // 画像の座標をyへ代入
   //BTN(LEFT, CLICK, x, y, 80)

   // スマートにしておく
   BTN(LEFT, DOWN, G_IMG_X, G_IMG_Y, 10)
   BTN(LEFT, UP, G_IMG_X, G_IMG_Y, 10)
   // 動作確認
   print 画像+"が見つかりました"
  endif
  // 次のインターバルまで放置
  Sleep(rest)
 wend
fend
    • good
    • 3

> ("A.BMP",0)を無制限ループしつつ、



無制限として、どれくらいの間隔ででしょう?
1分に1回程度でよいのか?1秒間に100回も1000回も処理する必要があるのか?

> 【3つ同時進行です。】

UWSCを実行開始した際に、ABCの処理を行なうのか?BやCは処理開始から30分後、2時間後とかでよいのか?

--
現在時刻を取得するGetTime()関数使ってタイマー作るのが良いと思います。
上の条件で、Aは10秒おき、BCはすぐに実行しないって事なら、

// 実行予定時刻
timerA = GetTime() // 今でしょ!
timerB = GetTime() + 30*60 // 今から30分後
timerC = GetTime() + 2*60*60 // 今から2時間後

While True // 無限ループ
 if timerA <= GetTime() then // タイマーAの時刻になってる?

  // Aの処理
  ifb CHKIMG("A.BMP",0)

   x=G_IMG_X // 画像の座標をxへ代入
   y=G_IMG_Y // 画像の座標をyへ代入

   BTN(LEFT, CLICK, x, y, 80)

  endif

  timerA = GetTime() + 10 // 次回実行は10秒後

 endif

 if timerB <= GetTime() then // タイマーBの時刻になってる?

  // Bの処理
  ~

  timerB = GetTime() + 30*60 // 次回実行は30分後

 endif

 if timerC <= GetTime() then // タイマーCの時刻になってる?

  // Cの処理
  ~

  timerC = GetTime() + 2*60*60 // 次回実行は2時間後

 endif

 Sleep(1) // 1秒休憩
Wend

とか。
    • good
    • 0

私もそれほど詳しくはありませんが


GETTIME()関数で時間判定できるのでそれを使って実装可能です

雑に書けば
I = GETTIME()
WHILE TRUE
  A.BMP処理

  IF (((GETTIME()ーI) MOD (2×60×60))= 0)
    B.BMP処理
  ENDIF

  IF (((GETTIME()ーI) MOD 60)= 0)
    C.BMP処理
  ENDIF
WEND

みたいな感じ
    • good
    • 0

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