- ベストアンサー
ループ計算の停止方法(visual C++)
VISUAL C++ .NET 2003で下記の内容のMFCアプリケーション (ダイアログベース)を作成したいと思っています。 ・開始ボタンを押してダイアログ(小窓)を開く (大規模な繰返し計算開始) ・ダイアログに計算経過を表示する ・ダイアログにある中止ボタンを押すと 計算が中止される ここで,開始ボタンのイベントハンドラに forループを記述することになると思うのですが, 中止ボタンが押されたかどうか監視する 方法が分かりません。よろしくお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
締め切り済みでないので書いてしまいましたが、 Ano1の方法は結構手軽に書けるので、そちらを説明します。 本格的にやる場合はAno2の方法を使うこともありますが・・・ プログラムでループを組む場合、そのループが終わるまでなかなか制御が他に廻ってきません。 それを可能にするのが以下の関数で、VBのDoEventsと同じと思ってください。 void DoEvents() { MSG msg; while (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { ::TranslateMessage(&msg); ::DispatchMessage(&msg); } } この関数を実装、ループの中で使います。 DoEvents()を呼び出し、他のウィンドウの処理があれば、その処理を行い戻ってきます。 for(なんたら) { 計算処理 DoEvents(); if(中止フラグ検査) break; } 基本的にはこの動きでいいと思いますが・・・ 注意しなければいけないことがあります。 DoEventsで他に制御が渡る為、開始ボタンすらも押せるはずです。有効であれば。 なので、ループ時間が長い処理の場合、 計算中にもう一度計算ボタンを押せば、計算処理を実行します。 この現象がまずければ、計算ボタンの抑制をかける必要があります。 一度お試しください。
その他の回答 (2)
- yosi_yosi
- ベストアンサー率35% (165/468)
#1さんの質問に追加して... 別のワーカースレッドを作成して、そのワーカースレッドで計算処理を行えばよいでしょう。単純に開始ボタンのイベントハンドラでforループを使って計算すると(通常は)次のメッセージが処理できないためにハングアップのような状態になってしまいます。そのワーカースレッド内のループ中に#1さんがおっしゃられるようなフラグのチェックをつけておけば大丈夫です。
お礼
有難うございます。 >単純に開始ボタンのイベントハンドラでforループを使っ >て計算すると(通常は)次のメッセージが処理できないた >めにハングアップのような状態になってしまいます。 やはりそうなりますよね。 >別のワーカースレッドを作成して・・・ 参考になるHPなどありましたら教えてください。
- 6dou_rinne
- ベストアンサー率25% (1361/5264)
ボタンを押すとONになるフラグを定義しておいてループの中でそのフラグを監視したらどうでしょうか。 ただ、ループの途中でイベントを監視するようにする必要がありますが。
お礼
有難うございます。 ループの途中でイベントを監視するには どうすればよろしいでしょうか?
お礼
遅れてすみません。 ご返信有難うございます。 PeekMessageで何とか出来そうですね。