HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0107
科学太郎onkeyを使うと[SHIFT]キーでループ内が早くなる現象を発見!!6解決


科学太郎

リンク

2016/1/7(Thu) 16:08:27|NO.74036

次のテスト・スクリプトをご覧ください。

#include "Kernel32.as" #const WM_MOUSEMOVE $00000200 *Init sdim bar,1000 *Main title "onkeyを使うと[SHIFT]キーでループ内が早くなる現象を発見!!" oncmd gosub *OnMouseMove,WM_MOUSEMOVE onkey gosub *OnKeyBoard GetTickCount:t1=stat ;ループ内 repeat count++ GetTickCount:t2=stat if(t2-t1)>=1000:t1=t2:count=0 redraw 0 color$00,$00,$00:boxf color$FF,$FF,$00:pos 0,0 mes strf("count=%d",count) ;バー memset bar,'*',1000 poke bar,count mes bar redraw 1 await 200 loop stop *OnKeyBoard if(iParam=='Q'):end return *OnMouseMove /* いろいろ行うが省略 */ return
上記のスクリプトを実行して[SHIFT]キーを押すとループ内が0.2秒ではなく
ものすごく早く繰り返されます。

その他にも WM_MOUSEMOVE メッセージの割り込みを使って
マウスカーソルをウインドウ内で移動しただけでループ内が
ものすごく早く繰り返されます。

この現象を回避する方法があれば教えて欲しいです。
また、この現象はバグと見るべきでしょうか?



この記事に返信する


科学太郎

リンク

2016/1/7(Thu) 16:42:40|NO.74037

追記。

「await 200」の行を
「Sleep 200:await」に置き換えるとループ内は0.2秒間隔になるようです。

どうやら割り込み処理を使うと「await」や「wait」が指定値(200ms)ではなく
1msか、0msになるらしい…。

ということは「await」、「wait」命令にバグがあるのかな?!



Makoto

リンク

2016/1/7(Thu) 17:03:06|NO.74039

キーに関しては SHIFT キー以外でも同じ現象が起きました。

原因ですが、
oncmd、onkey、の説明を見ると、
>割り込みジャンプは、stop命令および、wait、 await命令で停止している時に割り込みを受け付けてジャンプを行います。
とあるので、
割り込みが発生した時点で、await 200 の動作がキャンセルされ、
サブルーチンが実行されたのち、直ちに loop に処理が移ってしまうので
動作が早くなっているのではないかと思われます。

ですから、これはバグというよりは仕様ではないでしょうか。



inovia

リンク

2016/1/7(Thu) 18:04:56|NO.74040




科学太郎

リンク

2016/1/7(Thu) 18:12:45|NO.74041

> 割り込みが発生した時点で、await 200 の動作がキャンセルされ、
> サブルーチンが実行されたのち、直ちに loop に処理が移ってしまうので
> 動作が早くなっているのではないかと思われます。
あぁ。なるほどね。

> 過去ログ
> つhttp://hsp.tv/play/pforum.php?mode=pastwch&num=37673
過去ログにもありましたか。

> ですから、これはバグというよりは仕様ではないでしょうか。
仕様でしたか…。ふーん。

とりあえずAPI関数の「Sleep 200:await」で
割り込み処理しない「await」命令になりますね。



スペース

リンク

2016/1/7(Thu) 18:33:41|NO.74042

おー!この現象、原因は分かってたけど対策が思いつかなかったので助かります。



窓月らら

リンク

2016/1/7(Thu) 19:47:11|NO.74045

なるほど、これはふつうに仕様ですね(バグじゃない)。
onkeyのジャンプ先(*OnKeyBoard)に
onkey 0: await 200: onkey 1
を入れてやっても対策できましたけど。



ONION software Copyright 1997-2023(c) All rights reserved.