Curl Global Community
ボタンの同時押しを制御する - Printable Version

+- Curl Global Community (https://communities.curl.com)
+-- Forum: Discussions (https://communities.curl.com/forumdisplay.php?fid=1)
+--- Forum: General Curl questions (https://communities.curl.com/forumdisplay.php?fid=2)
+--- Thread: ボタンの同時押しを制御する (/showthread.php?tid=898)



ボタンの同時押しを制御する - umemura - 05-15-2013

ある画面で二つのボタンがあるとして、
この二つの処理は同時に実行されないようにしたいと思っています。

マウス操作ではまず不可能ですが、
それぞれにショートカットキーがF1とF2に割り当てられている場合だと、
キーの同時押しで同時実行ができてしまうと思います。

これを制御するにはどうすればよいでしょうか。
イベントキューという考えがある以上、まったく同時に処理されることはないという認識ですが、
dipatch-event などを利用することで、後から発行されたキーイベントを無視できないでしょうか。


なお、ボタンのダブルクリックについては、LIBライブラリのwith-busy-view が有効という認識です。



RE: ボタンの同時押しを制御する - dyoshida - 05-16-2013

”イベントキューという考えが”と書かれているとおり、通常はイベントはシングルスレッドで
処理されて、ショートカットキーをほぼ同時に2つ押しても、ボタンを順に2つ押した場合と同じ
動作になりそうなので、キーイベントだからというよりも、イベント処理中に他のイベント処理
が割り込まれないようにするにはどうするか?というテーマですね。

イベントハンドラから呼ばれた処理の実行中に他のイベントハンドラが呼ばれるのは
イベントハンドラから呼び出す処理がマルチスレッド処理の場合か、シングルスレッドでも
時間がかかる処理内でdispatch-eventsプロシージャを呼び出して意図的に他の
イベントを処理するデザインにした場合だと思います。

このような場合、ある状態の間に特定のキーイベントを無視するためにイベントキューを
直接操作して特定のキーイベントを抜くというような方法はCurlに限らず安全でない
手段の部類だと思いますので、イベントハンドラが呼ばれた後の処理で対応するのは
どうでしょうか?

ある状態の間は各種イベントの扱いを変えたいという場合、内部の処理状態をフラグや
簡単なステートマシンで管理して、イベントハンドラが呼ばれた際に内部状態が処理中の
場合はなにも処理をしない、という実装をCurl以外のGUIアプリでもよく見かけます。