2017年5月20日土曜日

[UWSC]タイムアウト関数(作り直し)


初心者のプログラミング導入のため、簡単な自作関数を作って公開しているブログ。意外に人気のあるタイムアウト関数(timeout)をもうちょっと便利に作り直しました。

記事の内容

○タイムアウト関数(作り直し)

以前タイムアウト関数というものを作ったのですが、意外に人気で結構検索エンジンから訪問下さいます。おそらくUWSCで何かを作ろうとチャレンジしてらっしゃる方かと思います。

ただ公開していたものは、やたらと使いにくい例だったので作り直ししてこちらの記事で再度公開します。


タイムアウト関数(作り直し)

以前作ったものは、ループがスタートした時刻と待ち時間を、呼び出し側から指定していました。
いちいち指定するのは面倒なので、ループのタイムアウト専用としてグローバル変数を2つ確保し呼び出し側のソースをスッキリさせる方法に修正しました。

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
            flug_loopstart=0
            RESULT=1
         ELSE
            SLEEP(0.1)
            RESULT=0
         ENDIF
FEND
関数のプログラム説明(○⇒:成り立つ場合、×⇒:成り立たない場合)
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_loopstarttime_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秒の休止としていますが、
よく見かけるのは0.01秒ですかね。お好みで変更してください。




呼び出し側のサンプル

こうしておくと呼び出し側がスッキリします。(whileの条件文に関数=0と書くだけで制限時間付きのループができます。)

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)

//ここに色んな命令を書く
PRINT a
a=a+1

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行目11PRINT "ループ出ちまった"
ループから出たことを見えるようにするため、コメントを表示させます。

tout_loop関数12行目の値、関数のの引数を変更して試すと動きがハッキリ見えてくると思います。



やはりポク太郎と同じように非同期プログラミングに苦戦している方はいらっしゃるようですね。
UWSCで作ろうとしているものがどういうものかをしっかり認識するために、こちらの記事で非同期プログラミングをしようとしているんだということを確認しておくといいかもしれません。


記事の内容

記事の内容は伝わりましたでしょうか。
○タイムアウト関数(作り直し)


関数群のダウンロードはこちら
func_poku.uwsのコメント欄に呼び出し方が書いてあります。


【関連記事】  [UWSC]配列のサイズを変更する二【要素を挿入・追加】
[UWSC]配列のサイズを変更する一【要素を削除】
[UWSC]iniファイルを扱う関数
[UWSC]画像が表示された中心座標を返す関数


スポンサーリンク



blogramのブログランキング

目次
コンピュータ(ハード/ソフト) 映画・ドラマ・芸能 変人のつぶやきとトラブル
ホームへ戻る ページ上部へ


0 件のコメント:

コメントを投稿