ゆうやんさんの言いたいことは、wait・await 中にウィンドウメッセージで、強制的にウェイトが終了してしまうのを対策したいという事だと思うが、oncmd gosub の指定解除する命令がない以上、別の対策法でしかない。
昔から、oncmd gosub を利用する場合は、wait・await は独自のウェイトに置き換えるか、(^_^)v さんの方法でしかないからね。
ちなみに HSP 内部ではこんな感じになっていて、 MsgWaitForMultipleObjects の QS_ALLINPUT ってのが原因。
関数を抜ける条件がすべての入力メッセージという事になっていて、oncmd gosub で指定されたメッセージが来ると、タイムアウト時間を無視してしまう。
// 高精度タイマー
tick = timeGetTime()+5; // すこし早めに抜けるようにする
if ( code_exec_await( tick ) != RUNMODE_RUN ) {
MsgWaitForMultipleObjects(0, NULL, FALSE, hspctx->waittick - tick, QS_ALLINPUT );
} else {
tick = timeGetTime();
while( tick < hspctx->waittick ) { // 細かいwaitを取る
Sleep(1);
tick = timeGetTime();
}
hspctx->lasttick = tick;
hspctx->runmode = RUNMODE_RUN;
#ifndef HSPDEBUG
if ( ctx->hspstat & HSPSTAT_SSAVER ) {
if ( hsp_sscnt ) hsp_sscnt--;
}
#endif
以下、(^_^)v さんのを改良してモジュール化したサンプル
#module
#define _THYPER //←をコメントアウトすると標準精度
#ifndef _THYPER
//標準精度のタイマー
#uselib "kernel32.dll"
#cfunc _GetTickCount "GetTickCount"
#else
//高精度のタイマー
#uselib "winmm.dll"
#cfunc _GetTickCount "timeGetTime"
#endif
#deffunc awaitEx int p1
if p1 < 0 : return
a_waittick = _GetTickCount() //開始のtick
e_waittick = a_waittick + p1 //終了のtick
await p1
repeat
p_waittick = _GetTickCount()
c_waittick = e_waittick - p_waittick
if c_waittick <= 0 : break
await c_waittick //残りの時間強制再ウェイト
loop
return
#deffunc waitEx int p1
if p1 < 0 : return
awaitEx (p1 * 10)
return
#global
#define WM_MOVE 0x0003
oncmd gosub *Dummy,WM_MOVE
waitEx 1000
mes "タイムアウト"
stop
*Dummy
return 0
んぁ、書き直してたら締め切られてた。
順序は逆になっちゃったけど、今後の対策法として残しておきます。