vc++のダイアログベースでプログラムを作成しています。
startボタン(OnButton1)を押してプログラムを開始し、stopボタン(OnButton2)を押
すまでループを回し続けるにはどうすれば良いでしょうか?
OnButton1内にループを作ると、他のボタンが押せなくなってしまいます。
どなたかよろしくお願いします。
SetTimerを使うとか、、、
安易な方法は、直接ループをさせるのではなくてTimerイベントを使って
ループしているように処理することです。
これなら処理中にイベントを受け取れるので処理の中断が出来ます。
もう一つの方法は、処理そのものを別のスレッドで行うようにして
する方法です。この方法だとメインスレッド(画面側)は普通に動作できます。
ただ、スレッドの方があまりに忙しすぎるとメインスレッドの動作が異様に
重くなったりするので適当なタイミングでsleepをいれるとか、
WaitForSingleObjectをタイムアウトを組み合わせる等で対処します。
通常、中止を行うような場合は、WaitForSingleObjectで続行可能かのチェックを
する様にしますから問題は起こりにくいと思います。
すいません~あまりよく分かりません・・・。
せっかくみなさん親切に教えてくださったのに。
void CReiDlg::OnButton1()
{
while(1){
//実行したいプログラム
}
}
void CReiDlg::OnButton2()
{
}
という形式の場合、具体的にどういう風に書けばいいんでしょうか・・・。
OnButton2()の中は何も書かなくてもいいということでしょうか?
申し訳ありませんがどなたかよろしくお願いします。
>void CReiDlg::OnButton1()
>{
> while(1){
> //実行したいプログラム
> }
>}
>
>void CReiDlg::OnButton2()
>{
>
>}
これではボタン1が押されたら無限ループになってしまいます。
このループを止める方法としてはタスクマネージャを起動して
タスクの終了という手順でしか手はないでしょう。
とーぜんアプリは終了してしまいますが・・・。
もし、プログラム上で行いたい時はタイマー処理を用いるか
別スレッドを立てるしか方法はないと思います。
(別の方法があったら教えてください。)
タイマ処理の方がお手軽かなって感じはしますけど、それは
「実行したいプログラム」の内容によってはどちらの処理が
適しているかは現状の情報だけでは判断しかねます。
void CReiDlg::OnButton1() {
タイマーを開始
}
void CReiDlg::OnButton2() {
タイマーを停止
}
void CReiDlg::タイマーイベント() {
実行したいプログラム
}
とかやれば、たとえば1秒に一回'実行したいプログラム'
に火がつきます。タイマーが停止するまで何度も何度も。
別の方法、、、
void CReiDlg::OnButton1()
{
while(1){
//先のURLを参考にする。
}
}
void CReiDlg::OnButton2()
{
EndDialog(0);//例
}
個人的にはNEGさんの紹介されている方法はあまりお勧めできないです。
この方法は、状況が込み入ってくると破綻する可能性があります。
例としてはウィンドウメッセージが処理終了後にくることを期待して
プログラミングしていると動作がおかしくなる。
この方法を多用するとあちこちにメッセージループが蔓延して
上記の症状が加速する等々。
基本的にメッセージループは一つのプログラム上は一つにするべきだと思います。
タイマーの方法がいやならスレッドにするのが本筋だと思いますよ。
ちょっと追加。
おさけんさんは、イベントドリブンの仕組みをもっときちんと理解されるべきでは
と思います。
イベントドリブンがどんなものかを理解できていれば、
自分が考えている方法ではうまく動かないのが理解できると思います。
まあ、私も薦めませんが、別の方法の参考として。
Windowsのプログラミングに慣れてない人にはやりやすい方法だとは思います。
「コンポーネントおよびコントロール ギャラリ」の「プログレス ダイアログ」も同様の処理
をしています。
http://www24.cds.ne.jp/~neg/pro/piyo1/cpd/make.html
もしかすると「プログレス ダイアログ」を使った方が今回の目的にあうとか?(?_?)
みなさん親切にどうもありがとうございました!
なんとなくみなさんの言っていることが分かってきました。
参考にしていろいろ勉強してみます!
ついこの前まで同じ問題で悩んでいたものです
1.タイマー 反応が遅いです
2.スレッド
・ volatile int flg;
・開始ボタン
flg=1
・ストップボタン
flg=1
・スレッド
flg=1;
while(flg){
ルーープ
Sleep(個々の数値でスピード調整)
}
3.参考書
Visual C++ 実線プログラミング
Win32APIシステムプロウラミング
間違えました
正しくは
・ストップボタン
flg=0
すみませんでした
シミュレーションに多用しています
それでもスピードが遅いときはstepをとばしています