ボタンを押してループを終了するには? – プログラミング – Home

ボタンを押してループを終了するには?
 
通知
すべてクリア

[解決済] ボタンを押してループを終了するには?


おさけん
 おさけん
(@おさけん)
ゲスト
結合: 24年前
投稿: 7
Topic starter  

vc++のダイアログベースでプログラムを作成しています。
startボタン(OnButton1)を押してプログラムを開始し、stopボタン(OnButton2)を押
すまでループを回し続けるにはどうすれば良いでしょうか?
OnButton1内にループを作ると、他のボタンが押せなくなってしまいます。
どなたかよろしくお願いします。


引用未解決
トピックタグ
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 23年前
投稿: 178
 

 SetTimerを使うとか、、、


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

安易な方法は、直接ループをさせるのではなくてTimerイベントを使って
ループしているように処理することです。
これなら処理中にイベントを受け取れるので処理の中断が出来ます。

もう一つの方法は、処理そのものを別のスレッドで行うようにして
する方法です。この方法だとメインスレッド(画面側)は普通に動作できます。
ただ、スレッドの方があまりに忙しすぎるとメインスレッドの動作が異様に
重くなったりするので適当なタイミングでsleepをいれるとか、
WaitForSingleObjectをタイムアウトを組み合わせる等で対処します。
通常、中止を行うような場合は、WaitForSingleObjectで続行可能かのチェックを
する様にしますから問題は起こりにくいと思います。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 23年前
投稿: 178
 

 こんなのとか、、、
http://www24.cds.ne.jp/~neg/pro/piyo1/multi/loop.html


返信引用
おさけん
 おさけん
(@おさけん)
ゲスト
結合: 24年前
投稿: 7
Topic starter  

すいません~あまりよく分かりません・・・。
せっかくみなさん親切に教えてくださったのに。

void CReiDlg::OnButton1()
{
while(1){
//実行したいプログラム
}
}

void CReiDlg::OnButton2()
{

}

という形式の場合、具体的にどういう風に書けばいいんでしょうか・・・。
OnButton2()の中は何も書かなくてもいいということでしょうか?
申し訳ありませんがどなたかよろしくお願いします。


返信引用
はお
 はお
(@はお)
ゲスト
結合: 23年前
投稿: 21
 

>void CReiDlg::OnButton1()
>{
> while(1){
> //実行したいプログラム
> }
>}
>
>void CReiDlg::OnButton2()
>{
>
>}
これではボタン1が押されたら無限ループになってしまいます。
このループを止める方法としてはタスクマネージャを起動して
タスクの終了という手順でしか手はないでしょう。
とーぜんアプリは終了してしまいますが・・・。

もし、プログラム上で行いたい時はタイマー処理を用いるか
別スレッドを立てるしか方法はないと思います。
(別の方法があったら教えてください。)
タイマ処理の方がお手軽かなって感じはしますけど、それは
「実行したいプログラム」の内容によってはどちらの処理が
適しているかは現状の情報だけでは判断しかねます。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

void CReiDlg::OnButton1() {
タイマーを開始
}

void CReiDlg::OnButton2() {
タイマーを停止
}

void CReiDlg::タイマーイベント() {
実行したいプログラム
}

とかやれば、たとえば1秒に一回'実行したいプログラム'
に火がつきます。タイマーが停止するまで何度も何度も。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 23年前
投稿: 178
 

 別の方法、、、

void CReiDlg::OnButton1()
{
while(1){
//先のURLを参考にする。
}
}

void CReiDlg::OnButton2()
{
EndDialog(0);//例
}


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

個人的にはNEGさんの紹介されている方法はあまりお勧めできないです。
この方法は、状況が込み入ってくると破綻する可能性があります。
例としてはウィンドウメッセージが処理終了後にくることを期待して
プログラミングしていると動作がおかしくなる。
この方法を多用するとあちこちにメッセージループが蔓延して
上記の症状が加速する等々。

基本的にメッセージループは一つのプログラム上は一つにするべきだと思います。

タイマーの方法がいやならスレッドにするのが本筋だと思いますよ。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

ちょっと追加。
おさけんさんは、イベントドリブンの仕組みをもっときちんと理解されるべきでは
と思います。
イベントドリブンがどんなものかを理解できていれば、
自分が考えている方法ではうまく動かないのが理解できると思います。


返信引用
NEG(ねぐ)
 NEG(ねぐ)
(@NEG(ねぐ))
ゲスト
結合: 23年前
投稿: 178
 

 まあ、私も薦めませんが、別の方法の参考として。
 Windowsのプログラミングに慣れてない人にはやりやすい方法だとは思います。

 「コンポーネントおよびコントロール ギャラリ」の「プログレス ダイアログ」も同様の処理
をしています。
http://www24.cds.ne.jp/~neg/pro/piyo1/cpd/make.html
 もしかすると「プログレス ダイアログ」を使った方が今回の目的にあうとか?(?_?)


返信引用
おさけん
 おさけん
(@おさけん)
ゲスト
結合: 24年前
投稿: 7
Topic starter  

みなさん親切にどうもありがとうございました!
なんとなくみなさんの言っていることが分かってきました。
参考にしていろいろ勉強してみます!


返信引用
suzugoya
 suzugoya
(@suzugoya)
ゲスト
結合: 23年前
投稿: 47
 

  ついこの前まで同じ問題で悩んでいたものです
1.タイマー  反応が遅いです
2.スレッド
・ volatile int flg;
・開始ボタン
flg=1
    ・ストップボタン
flg=1
・スレッド
flg=1;
while(flg){
ルーープ
Sleep(個々の数値でスピード調整)
}
3.参考書
Visual C++ 実線プログラミング
   Win32APIシステムプロウラミング


返信引用
suzugoya
 suzugoya
(@suzugoya)
ゲスト
結合: 23年前
投稿: 47
 

間違えました
正しくは
  ・ストップボタン
flg=0
すみませんでした
シミュレーションに多用しています
それでもスピードが遅いときはstepをとばしています


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました