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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1010
こいる無効中ボタンの連打を防止する方法2解決


こいる

リンク

2020/10/10(Sat) 17:21:58|NO.91578

時間が掛かる処理を実行するボタンを設置し、処理中はボタンを無効化します。
それにも関わらず、処理中に、無効化したボタンを連打すると、処理が終わった後に、
連打した分がまた実行されてしまいます。

時間が掛かる処理は、Sleep関数で代用しています。
wait,awaitだと再現できません。

#uselib "kernel32.dll" #func Sleep "Sleep" sptr button gosub "連打する",*a id_button = stat stop *a logmes "start" objenable id_button,0 wait 1 // 無効化待ち Sleep 2000 // なにかしらの処理時間 objenable id_button,1 logmes "end \n" return


これの対策として、前回の処理からの経過時間が一定以下ならスキップするというのを思いついたのですが、
その「一定以下」が環境(処理性能)によって変わってしまうので、完璧ではないような気がします。

#uselib "kernel32.dll" #func Sleep "Sleep" sptr #uselib "winmm.dll" #func timeGetTime "timeGetTime" button gosub "連打する",*a id_button = stat stop *a // 前回の処理から10ms以下しか経っていない場合return if (timeGetTime()-last_time)<=10 { logmes "return" last_time = timeGetTime() return } logmes "start" objenable id_button,0 wait 1 Sleep 2000 objenable id_button,1 logmes "end \n" last_time = timeGetTime() return


なので、今度は下記ページを参考にして、
http://zecl.hatenablog.com/entry/20081101/p1#f1
C#が分からないながら勘でそれっぽいものを作ってみたのですが、うまく動きません。
Buttonを作る、とあるのでやり方が違うのかもしれませんが、よく分かりませんでした。

#uselib "kernel32.dll" #func Sleep "Sleep" sptr #uselib "user32.dll" #func PeekMessage "PeekMessageA" sptr,sptr,sptr,sptr,sptr #func DispatchMessage "DispatchMessageA" sptr button gosub "連打する",*a id_button = stat stop *a logmes "start" objenable id_button,0 wait 1 // 無効化待ち Sleep 500 // なにかしらの処理時間 objenable id_button,1 // 保留されているメッセージを削除する dim MSG,7 PeekMessage varptr(MSG), 0, 0, 0, 0x0001;PM_REMOVE logmes strf("メッセージ: %#x", MSG.1) switch MSG.1 case 0x202; WM_LBUTTONUP case 0x2A3; WM_MOUSELEAVE case 0xF; WM_PAINT DispatchMessage varptr(MSG) swbreak swend logmes "end \n" return


なにか良いやり方はないでしょうか?
ご教示お願いします。



この記事に返信する


沢渡

リンク

2020/10/10(Sat) 19:43:38|NO.91579

PeekMessageの返り値が0になるまでリピートさせたらどうなるでしょう?
(リンク先のページではそのようになっているようなので)

#uselib "kernel32.dll" #func Sleep "Sleep" sptr #uselib "user32.dll" #func PeekMessage "PeekMessageA" sptr,sptr,sptr,sptr,sptr #func DispatchMessage "DispatchMessageA" sptr button gosub "連打する",*a id_button = stat stop *a logmes "start" objenable id_button,0 wait 1 // 無効化待ち Sleep 1000 // なにかしらの処理時間 objenable id_button,1 // 保留されているメッセージを削除する dim MSG,7 repeat PeekMessage varptr(MSG), 0, 0, 0, 0x0001;PM_REMOVE if stat=0 : break logmes strf("メッセージ: %#x", MSG.1) switch MSG.1 case 0x202; WM_LBUTTONUP case 0x2A3; WM_MOUSELEAVE case 0xF; WM_PAINT DispatchMessage varptr(MSG) swbreak swend loop logmes "end \n" return



こいる

リンク

2020/10/10(Sat) 21:14:24|NO.91581

なるほど、whileで、
メッセージがなくなるまで繰り返していたのですね。

switchのところは、あの3つのメッセージは送り返してたって感じでしょうか。


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



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