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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
0325
knock2SetTimerについて9解決


knock2

リンク

2008/3/25(Tue) 12:52:49|NO.14575

この↓例題においてwait 200が全く効果無いのですがその理由と対応方法を教えてください。

#uselib "user32.dll" #func SetTimer "SetTimer" int,int,int,int #func KillTimer "KillTimer" int,int onexit *exit oncmd gosub *OnTimer, 0x0113 repeat SetTimer hwnd, 1, 500, 0 wait 200;←これが効かない mes cnt loop *OnTimer KillTimer hwnd, 1 mes "OnTime" return *exit KillTimer hwnd, 1 END



この記事に返信する


KENTA

リンク

2008/3/25(Tue) 20:29:20|NO.14583

//対応方法

wait 200
ではなく

repeat 200 wait 1 loop
を利用すると割り込んでも、うまくいきます。



knock2

リンク

2008/3/26(Wed) 12:19:43|NO.14594

ありがとうございます。

SetTimer時間の方が長い時はSetTimerが無効?になりますね。
waitとSetTimerに相関作用があるようですがどう理解すれば良いのでしょう?



KENTA

リンク

2008/3/26(Wed) 13:34:46|NO.14596

SetTimerは一回呼び出すだけで、毎回割り込みが発生するので
ループ外でSetTimerを呼び出してください。
そして割り込みが発生したあと、KillTimerでタイマーを削除する必要はありません。
KillTimerはプログラムが終了するときに呼び出してください。

#uselib "user32.dll" #func SetTimer "SetTimer" int,int,int,int #func KillTimer "KillTimer" int,int SetTimer hwnd,1,500,0 onexit *exit oncmd gosub *sub,0x113 *main repeat 200 wait 1 loop mes "LOOP" goto *main *sub mes "OnCmd" return *exit KillTimer hwnd,1 end



knock2

リンク

2008/3/26(Wed) 15:08:56|NO.14598

>毎回割り込みが発生するので
>KillTimerでタイマーを削除する必要はありません。

分かっています。

提示したものはプログラムループの中でワンショットタイマー(本当は毎回タイマー値が変化する)
を起動する実験スクリプトです。WAIT値も状況によって変化します。

どんなWAIT値でもワンショットタイマーを働かせたいのです。



KENTA

リンク

2008/3/26(Wed) 16:52:02|NO.14599

>SetTimer時間の方が長い時はSetTimerが無効?になりますね。
>waitとSetTimerに相関作用があるようですがどう理解すれば良いのでしょう?

例えば

//割り込み、そのあとの処理などは省略... repeat SetTimer hwnd,1,1100,0 //タイマー初期化 (1.1秒で割り込み) repeat 100 //ループ開始 (1秒間ループ) wait 1 loop loop
というスクリプトだとします。
loopから抜けるときには割り込みまで、あと約0.1秒(100ms)です。
しかし、割り込む前にSetTimerでタイマーを初期化してしまうので、
割り込みまでの時間も初期化されてしまうのです。



knock2

リンク

2008/3/26(Wed) 21:40:43|NO.14607

>SetTimer時間の方が長い時はSetTimerが無効?になりますね。
あっ、当然でしたね。

そうすると
SetTimer hwnd, 1, 500, 0
wait 200

この時は動作から推測するとwait中に割り込みがあってスタックポインタはwaitの次の行を
指していて割り込みから戻る時にすぐに次の行を実行してしまうのでしょうか?

もしそうならonXXX gosub 系コマンドを使うとwaitやawaitが正常に機能する保障がなくなる
(めったにないことですが100%ではない)と思うのですがどうなんでしょう?



KENTA

リンク

2008/3/26(Wed) 23:05:22|NO.14608

>この時は動作から推測するとwait中に割り込みがあってスタックポインタはwaitの次の行を
>指していて割り込みから戻る時にすぐに次の行を実行してしまうのでしょうか?
その通りだと思います。

>もしそうならonXXX gosub 系コマンドを使うとwaitやawaitが正常に機能する保障がなくなる
>(めったにないことですが100%ではない)と思うのですがどうなんでしょう?
そういうことになりますね・・・。
しかし、自分で改善しようとすれば、正常に機能する確率が上がると思います。



KENTA

リンク

2008/3/26(Wed) 23:30:17|NO.14610

一応、waitやawait中に割り込んでも少しは大丈夫なように
修正したスクリプトを書き込んどきます。

#module addwait #undef wait #deffunc wait int _p1 count=0 if _p1>0 { *waitloop wait@hsp 1 count++ if count=_p1 :goto *waitexit goto *waitloop *waitexit }else{ //0の場合、wait 0 wait@hsp 0 } return #undef await #deffunc await int _p1 count=0 if _p1>=10 { //10ms単位でwaitで待つ *awaitloop wait@hsp 1 count++ if count=_p1/10 :goto *awaitexit goto *awaitloop *awaitexit } //1~9はなんともならない(ループすると処理が間に合わないため)ので、 //正常に機能しないこと覚悟にそのまま渡す。 await@hsp _p1\10 return #global



knock2

リンク

2008/3/27(Thu) 21:29:31|NO.14640

>>もしそうならonXXX gosub 系コマンドを使うとwaitやawaitが正常に機能する保障がなくなる
>そういうことになりますね・・・。

本当ですか?(すみません疑っている訳ではなく驚いているところです)
確かに割り込みはwaitかawaitかstopの時に受け付けることになっていますがまさか割り込み
を受け付けたwaitやawaitの時間が無効になっているとは知りませんでした。

本当の時間稼ぎをする場合は提示頂いたスクリプトのように自分で工夫する必要がありそう
ですね。マニアルかヘルプに注意事項として書いてあれば良いのに!

ありがとうございました。



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