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


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
0831
(’’HSPのonkey命令でawaitが狂う5解決


(’’

リンク

2013/8/31(Sat) 22:10:54|NO.56781

onkey gosub *keydown
*main if ginfo_cy>ginfo_winy : cls mes "0.5秒" ;0.5秒感覚でメッセージ await 500 goto *main *keydown mes iparam ;WM_KEYDOWNでキーコード表示 return

このソースコードを実行すると0.5秒間隔でメッセージが表示されます
でもなにかウィンドウメッセージに反応すると直後のawaitやwaitが消えるんですが、これはバグでしょうか?

ヘルプには特に記述は見つからなくて、ゲームなんかでウィンドウメッセージを使うときawaitが消えるとなるとかなり困ります・・・



この記事に返信する


暇人

リンク

2013/8/31(Sat) 23:54:18|NO.56783

>これはバグでしょうか?
仕様(こうじゃないとメッセージに即座に反応して欲しい時困る)
wait待機中にメッセージを受け取ったら
待機を中断してるだけで消えてる訳じゃない

on系を使いながら一定の時間待機したいなら
waitだけじゃなく時間で管理するかWin32Apiのsleepを併用する

#uselib "KERNEL32.DLL" #func Sleep "Sleep" sptr onkey gosub *keydown *main if ginfo_cy>ginfo_winy : cls mes "0.5秒" ;0.5秒感覚でメッセージ Sleep 500 await 0 goto *main *keydown mes iparam ;WM_KEYDOWNでキーコード表示 return
通常Sleepは環境により精度が違う(10ms前後)ので注意
精度を設定する事は出来る



(’’

リンク

2013/9/1(Sun) 00:33:17|NO.56784

おおなるほど・・・
ということはHSPのoncmd系はコールバック関数のWindowProcとは違うってことでしょうか?



暇人

リンク

2013/9/1(Sun) 00:33:57|NO.56785

時間管理だとこんな感じ

onkey gosub *keydown *main if ginfo_cy>ginfo_winy : cls mes "0.5秒" ;0.5秒感覚でメッセージ c=0 a=gettime(7) repeat await 1 b=gettime(7) c+=(b-a+1000)\1000 if c>=500 {break} a=b loop goto *main *keydown mes iparam ;WM_KEYDOWNでキーコード表示 return
gettime(7)の精度も10ms程度なので注意(awaitの精度は上がってるのに・・・)

Sleepのとはキーリピートに対する動作の違いがある
場合によってはSleepの方も時間で管理が必要になる
Sleep中はメッセージを受け取らないので
設定を大きくするとウィンドウ操作の反応が鈍くなる



暇人

リンク

2013/9/1(Sun) 00:48:42|NO.56786

>仕様(こうじゃないとメッセージに即座に反応して欲しい時困る)
メッセージ処理の後に続けて即座に処理をしたい場合だった・・・



暇人

リンク

2013/9/1(Sun) 01:16:29|NO.56787

>ということはHSPのoncmd系はコールバック関数のWindowProcとは
on系はawait,wait,stopの待機中にのみ溜まったメッセージの受信処理がされる
何時メッセージが送られても待機中以外は受信されない



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