2017年5月20日土曜日

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

UWSCという開発ソフトを使って作り上げる作業を実際にやってみるカテゴリ。準備した自作関数や使い方、トラブルを記事にしていきます。得るものがあれば幸いです。
意外に人気のあるタイムアウト関数(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
            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で作ろうとしているものがどういうものかをしっかり認識するために、こちらの記事で非同期プログラミングをしようとしているんだということを確認しておくといいかもしれません。


記事の内容

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


【関連記事】
[UWSC]現在のタイムスタンプ(文字列)を返す関数
[UWSC]日付時刻を文字列で返す関数


スポンサーリンク



↓ ランキングに参加しています!(Ctrlキーを押しながら) ↓

blogramのブログランキング

ポク太郎の「俺の説明聞いてくれ」 コンテンツ
ポク太郎の「俺の説明聞いてくれ」最キラー記事 IT関連
電気回路やプログラムの記事。元々のメインコンテンツ。
UWSC奮闘記
プログラミングのできる子に
デジタルの世界って
映画・ドラマ・芸能
ハリウッドが主のエンターテイメントの記事。最近は似顔絵多し。
戦士の息抜き
ブログ運営
AnalyticsやSerchConsolなどの使い方、アクセスアップに関する話題。
アドセンス関連
他のGoogleツール
その他
アホのもくろみ
アホの雑記
取りとめもなく好き勝手に書く記事。不本意にも一番人気だったり。
役に立つかも
休むに似たり
好き勝手に書く
落書き漫画
何故人気なのか全く解らない数コマ漫画。結局最大コンテンツに。
物思いに耽る
免責事項 ホームへ戻る

スポンサーリンク





0 件のコメント:

コメントを投稿