- ベストアンサー
連続してボタンを押すと多重実行されてしまう問題の解決方法
- VC++2008ExpressEditionを使用してプログラムを作成し、ボタンを連続して押すと多重実行される問題が発生しています。
- 解決方法として、関数内でフラグ変数を使用し、多重実行を防止する手法があります。
- また、関数が実行中はボタンを無効化し、自分で作成したアイテムを操作できないようにすることで解決できます。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
イベント内でループをしているため メッセージポンプが機能しないのが原因でしょう そのため ボタンのClickメッセージがWindowsのメッセージキューに残ってしまい Clickイベントが終了してからもう一度呼ばれるといったことが繰り返されます forループの中で Application::DoEvents() を実行するようにしてみましょう for(i=0;i<200;i++){ int t=clock(); while(10>clock()-t); textBox4->Text+=L"aaraeaewa"+i+L"\r\n"; textBox4->SelectionStart = textBox4->Text->Length; textBox4->ScrollToCaret(); // これを追加 ClickイベントなどのWindowsメッセージを処理 Application::DoEvents(); }
その他の回答 (2)
- chie65536(@chie65535)
- ベストアンサー率44% (8800/19959)
蛇足な追記。 static bool flug=false; 「何かの目印」と言う意味での変数なら、変数名は「flug」ではなく「flag」です。
- chie65536(@chie65535)
- ベストアンサー率44% (8800/19959)
>この関数を実行中は多重実行されないことを想定しているのですが、やってみると多重実行されてしまいます。 余計なフラグ判定が原因。 static bool flug=false; if(flug)return; flug=true; と flug=false; を削ってみましょう。 ボタン1が押された瞬間、関数の入り口でボタン1のEnabledをfalseにすれば、処理が終わるまで「押そうと思っても絶対に押せない」ので、多重実行はしない「筈」です。 もちろん、関数の出口でEnabledをtrueに戻すのも忘れないように。 要は、自分自身のEnabledプロパティが再入フラグの代わりになるのです。
お礼
解答有り難うございます。 このフラグは無くて出来なかったから付けたものなので付いていても消えていても、無理でした。
お礼
解答有り難うございました 確かにこのようにすると、再描画がかけられるのでできました。