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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1102
れかawait とウィンドウタイマーを共用するとおかしくなる4解決


れか

リンク

2020/11/2(Mon) 20:27:14|NO.91726

awaitとウィンドウタイマーを共用するとなんかおかしくなります
例えば1秒毎に変数を増やすプログラムがあったとして
それにウィンドウタイマーをつけると1秒毎ではなく
0.30秒ごと位に増えてしまいます。

#uselib "user32.dll" #func SetTimer "SetTimer" int,int,int,int #func KillTimer "KillTimer" int,int #define WM_TIMER 0x0113 #define TIMER_ID 1 ;タイマーID oncmd gosub *OnTimer, WM_TIMER onexit goto *OnQuit SetTimer hwnd, TIMER_ID, 250, 0 ;タイマーセット(これをコメントアウトにするとちゃんと1秒毎に数字が増える) repeat;無限ループ cls aa=aa+1 mes aa await 1000;一秒ごとに数字を増やす loop *OnTimer;タイマー処理(空) return *OnQuit;終了時にはタイマーキル KillTimer hwnd, TIMER_ID end

何とかawait とウィンドウタイマーの共用は出来ないでしょうか。



この記事に返信する


ゆうやん

リンク

2020/11/2(Mon) 22:24:34|NO.91727

await 1000 ではなく、

repeat 60:await 16:loop
にしてみてはどうでしょうか。



沢渡

リンク

2020/11/2(Mon) 22:25:07|NO.91728

SetTimerで250ミリ秒(=0.25秒)ごとに*OnTimerに飛ぶようにしているので、
await 1000で待っている途中で*OnTimerに飛んだら、
その時点で残りの待ち時間はキャンセルされて次の命令(loop)に進むのですから、
それで0.25秒ごとに数字が増えていくのではないかと。

#uselib "user32.dll" #func SetTimer "SetTimer" int,int,int,int #func KillTimer "KillTimer" int,int #define WM_TIMER 0x0113 #define TIMER_ID 1 ;タイマーID oncmd gosub *OnTimer, WM_TIMER onexit goto *OnQuit SetTimer hwnd, TIMER_ID, 1000, 0 ;タイマーセット(1秒ごとに*OnTimerに飛ぶものとする) repeat;無限ループ await 1000 //ここの指定時間は処理には関係ない loop stop *OnTimer;タイマー処理 cls aa=aa+1 mes aa return *OnQuit;終了時にはタイマーキル KillTimer hwnd, TIMER_ID end



MIZUSHIKI

リンク

2020/11/3(Tue) 02:26:33|NO.91729

沢渡さんのおっしゃられている通りでawaitの待ち時間が残っていてもoncmd(onkey/onclick)でラベルジャンプしたらawaitの次の行に進んでいってしまいます。
直感的には残りの待ち時間を再waitして欲しいんですけどね。

ということで、
「waitした時の時間を記録しておき、oncmd等によってwait抜けしたとき残ってる時間はないか計算して残ってたらその分再waitする」
というモジュールを作りました。
wait / await の処理を上書きしています。


// // mod_waiton.hsp - ver.1.2.2.bbs(必要な部分だけ抽出) by MIZUSHIKI // #module m_won #defcfunc tGT@m_won #ifndef _HSP3DISH #uselib "winmm.dll" #cfunc timeGetTime "timeGetTime" return timeGetTime() #else getreq time24, SYSREQ_TIMER return time24 #endif #define global waiton(%1=100) :\ wtime@m_won = tGT@m_won() :\ while 1 :\ nokori@m_won = %1-(tGT@m_won() - wtime@m_won)/10 :\ if( nokori@m_won<=0 ){ _break } :\ wait@hsp nokori@m_won :\ wend :\ awtime@m_won = tGT@m_won() #define global awaiton(%1=0) :\ if( awtime@m_won=0 ){ awtime@m_won = tGT@m_won() } :\ while 1 :\ nokori@m_won = %1-(tGT@m_won() - awtime@m_won) :\ if( nokori@m_won<=0 ){ _break } :\ await@hsp nokori@m_won :\ wend :\ awtime@m_won = tGT@m_won() //標準のwait/awaitを削除し、waiton/awaitonで上書き #undef wait #define global wait waiton #undef await #define global await awaiton #global // // ↑ ここまでモジュール // // ↓ れか さんのスクリプト #uselib "user32.dll" #func SetTimer "SetTimer" int,int,int,int #func KillTimer "KillTimer" int,int #define WM_TIMER 0x0113 #define TIMER_ID 1 ;タイマーID oncmd gosub *OnTimer, WM_TIMER onexit goto *OnQuit SetTimer hwnd, TIMER_ID, 250, 0 ;タイマーセット(これをコメントアウトにするとちゃんと1秒毎に数字が増える) repeat;無限ループ cls aa=aa+1 mes aa await 1000;一秒ごとに数字を増やす loop *OnTimer;タイマー処理(空) tc++ : title "TimerCount: "+tc ; ← 確認用で追記しました return *OnQuit;終了時にはタイマーキル KillTimer hwnd, TIMER_ID end

「await/waitはちゃんと待ってくれない」
http://hsp.tv/play/pforum.php?mode=pastwch&num=88056

実はここでも同様の質問があり、似たような回答をしています。
モジュールを少し変更してありますが概ね同じなので、モジュールの詳細はコチラを参照ください。



れか

リンク

2020/11/3(Tue) 09:25:50|NO.91730

ありがとうございました。
ウィンドウタイマーとawait の共用ができました。



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