意外に人気のあるタイムアウト関数(timeout)をもうちょっと便利に作り直しました。
○タイムアウト関数(作り直し)
以前タイムアウト関数というものを作ったのですが、意外に人気で結構検索エンジンから訪問下さいます。おそらくUWSCで何かを作ろうとチャレンジしてらっしゃる方かと思います。
ただ公開していたものは、やたらと使いにくい例だったので作り直ししてこちらの記事で再度公開します。
タイムアウト関数(作り直し)
いちいち指定するのは面倒なので、ループのタイムアウト専用としてグローバル変数を2つ確保し呼び出し側のソースをスッキリさせる方法に修正しました。
(2017年9月24日追記)
ただし、一重ループのみで使用可能。以下の5行目以降のように多重に使用することはできないのでご注意ください。
1 2 3 4 5 6 7 8 9 10 | //使用例 WHILE (tout_loop(2)=0) //ここに色んな命令を書く WEND //使用できない例 WHILE (tout_loop(5)=0) WHILE (tout_loop(2)=0) //ここに色んな命令を書く WEND WEND |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | FUNCTION tout_loop(tout) PUBLIC flug_loopstart,time_loopstart IF flug_loopstart=0 time_loopstart=GETTIME() flug_loopstart=1 ENDIF IF (GETTIME()–time_loopstart)>=tout |
1,15行目 | 1 15 | FUNCTION tout_loop(tout) FEND |
tout_loop([秒数])関数定義 引数として渡された[秒数]だけ時間が経っていなかったら0、経っていたら1を返す関数。 | ||
2行目 | 2 | PUBLIC flug_loopstart,time_loopstart |
まず、ループ開始時の状態を記憶するためのグローバル変数を2つ準備。 flug_loopstart:現在ループなら1、違うなら0 time_loopstart:ループを開始したときの時刻 このソースでは、関数が呼ばれるたびに宣言文が実行されてしまいます。 とりあえずは動いています。 | ||
3~6行目 | 3 4 5 6 | IF flug_loopstart=0 time_loopstart=GETTIME() flug_loopstart=1 ENDIF |
現在ループ中かどうかを判定しています。 ○⇒ 4、5行目は無視するので何もしない。 ×⇒ 開始した状態として、flug_loopstartとtime_loopstartに状態を記憶。 | ||
8~14行目 | 8 9 10 11 12 13 14 | IF (GETTIME()–time_loopstart)>=tout flug_loopstart=0 RESULT=1 ELSE SLEEP(0.1) RESULT=0 ENDIF |
関数に指定された[秒数]が経っているかどうかの判定 ○⇒ flug_loopstart=0とループが終わったことを記録し、関数の戻り値として1を返す。 ×⇒ SLEEP(0.1)と0.1秒間の休止を行った上で、関数の戻り値として0を返す。 UWSCは高速演算のためのツールではないので0.1秒の休止としていますが、 |
呼び出し側のサンプル
1 2 3 4 5 | WHILE (tout_loop(2)=0) //ここに色んな命令を書く WEND |
1,5行目 | 1 5 | WHILE (tout_loop(2)=0) WEND |
whileの条件として、 tout_loop(2)=0 と書いておくと2秒間のタイムアウトとして働きます。 |
動作確認
1 2 3 4 5 6 7 8 9 10 11 | a=0 WHILE (tout_loop(2)=0) //ここに色んな命令を書く WEND PRINT “ループ出ちまった“ |
3,9行目 | 3 9 | WHILE (tout_loop(2)=0) WEND |
動作確認する部分です。 | ||
1,6~7行目 | 1 6 7 | a=0 PRINT a a=a+1 |
確認のために変数aを定義し、ループの度に値を表示し、インクリメント(+1)させています。 | ||
11行目 | 11 | PRINT “ループ出ちまった“ |
ループから出たことを見えるようにするため、コメントを表示させます。 |
tout_loop関数12行目の値、関数のの引数を変更して試すと動きがハッキリ見えてくると思います。
やはりポク太郎と同じように非同期プログラミングに苦戦している方はいらっしゃるようですね。
UWSCで作ろうとしているものがどういうものかをしっかり認識するために、こちらの記事で非同期プログラミングをしようとしているんだということを確認しておくといいかもしれません。
○タイムアウト関数(作り直し)
コメント