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つのメッセージは送り返してたって感じでしょうか。


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



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.91578への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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