ボタンによるループの途中停止 – プログラミング – Home

ボタンによるループの途中停止
 
通知
すべてクリア

[解決済] ボタンによるループの途中停止


eiji
 eiji
(@eiji)
ゲスト
結合: 25年前
投稿: 76
Topic starter  

初めて利用させていただきます。
Win2000 VC++6.0 MFC ダイアログベース
なのですが、ボタンを押した際にforループを実行するようにしています。
forの条件に合うまで待てば問題なく終了できるのですが、
途中で終了する方法を探しています。
以下のようにキーボードを押せばbreakで抜けようとしたのですが、
なぜかキーボードを押すと逆に終わらなくなり、強制終了でないと終わらなくなってしまいま
す。

void CTestDlg::OnButton1()
{
for(n=0;n<100000000;n=n+1)
{ x = x + 1;
x = x * 2;
x = x / 2;
}
m_mozi.SetWindowText(終了);
UpdateData();

}


引用未解決
トピックタグ
eiji
 eiji
(@eiji)
ゲスト
結合: 25年前
投稿: 76
Topic starter  

すいません。途中で送信してしまいました。

初めて利用させていただきます。
Win2000 VC++6.0 MFC ダイアログベース
なのですが、ボタンを押した際にforループを実行するようにしています。
forの条件に合うまで待てば問題なく終了できるのですが、
途中で終了する方法を探しています。
以下のようにキーボードを押せばbreakで抜けようとしたのですが、
なぜかキーボードを押すと逆に終わらなくなり、強制終了でないと終わらなくなってしまいま
す。
ボタンを押す、またはキーボードを押したら終了できる方法を教えてもらえませんでしょうか?
よろしくお願いします。

void CTestDlg::OnButton1()
{
for(n=0;n<1000;n=n+1)
{
*
*
*

if (_kbhit()) break;
}

}


返信引用
をよよ
 をよよ
(@をよよ)
ゲスト
結合: 22年前
投稿: 15
 

スレッドを使ってはいかがでしょうか。

// ごく簡単な例
// ボタン1を押すとスレッド(func)がスタート
// ボタン2を押すとスレッドが停止
// CreateThreadなどもある。

#include <process.h>

void func( void* pObj )
{
CTestDlg* pDlg = ( CTestDlg* )pObj;
while( pDlg->m_bContinue )
{
;
}
pDlg->MessageBox( finised, thread );
}

void CTestDlg::OnButton1()
{
m_bContinue = true;
_beginthread( func, 0, this );
}

void CTestDlg::OnButton2()
{
m_bContinue = false;
}


返信引用
...
 ...
(@...)
ゲスト
結合: 22年前
投稿: 113
 

m_bContinue は volatile にしとかんとあかんな。


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

 CProgressDlgを使った例。(^_^;
http://www24.cds.ne.jp/~neg/pro/piyo1/cpd/make.html


返信引用
冬夜
 冬夜
(@冬夜)
ゲスト
結合: 22年前
投稿: 6
 

for分の中にPeekMessageを入れれば
イイと思います。


返信引用
eiji
 eiji
(@eiji)
ゲスト
結合: 25年前
投稿: 76
Topic starter  

をよよさん、...さん、NEGさん、冬夜さん、返信ありがとうございます。
説明が足りませんでした。
使用目的は実験装置の動作に使用して、forで目的の回数繰り返す。
その際に異常が起きた際に途中で止める、といのが目的だったのでforはやめれないのです。
CProgressDlgは試したことなく、PeekMessageは聞いた事もなかったです・・・
勉強して、また成功したら報告させてもらいます。


返信引用
をよよ
 をよよ
(@をよよ)
ゲスト
結合: 22年前
投稿: 15
 

なにかあった時に、繰り返し処理を終了するのではなく、中断させるということです
ね。
こだわるわけではありませんが、スレッドでもこんなふうにすればできないことはあり
ませんよ。
あくまでもお試し用のコードですが、応用は可能と思われます。

#include <process.h>

void func( void* pObj )
{
CTestDlg* pDlg = ( CTestDlg* )pObj;
for( int i = 0; i < 1000; ++i )
{
::Sleep( 2 );
if( !pDlg->m_bContinue )
{
char msg[ 100 ];
sprintf( msg, break at %d, i );
pDlg->MessageBox( msg, thread );
pDlg->m_bContinue = true;
}
}
pDlg->MessageBox( finised, thread );
}

void CTestDlg::OnButton1()
{
m_bContinue = true;
_beginthread( func, 0, this );
}

void CTestDlg::OnButton2()
{
m_bContinue = false;
}

> m_bContinue は volatile にしとかんとあかんな。

ですね。大事なコメントありがとうございました。 > ...さん


返信引用
eiji
 eiji
(@eiji)
ゲスト
結合: 25年前
投稿: 76
Topic starter  

をよよさん、ありがとうございます。
試してみましたが、まさにこの機能でした。
プログラムもシンプルで、これならすぐ応用して作れそうです。
丁寧な説明本当にありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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