ボタンによるループの途中停止

[戻る]
eiji 2003/11/05(水) 21:08:10
初めて利用させていただきます。
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 2003/11/05(水) 21:12:25
すいません。途中で送信してしまいました。

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

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

       if (_kbhit())   break;
    }

}

をよよ 2003/11/05(水) 21:45:52
スレッドを使ってはいかがでしょうか。

// ごく簡単な例
// ボタン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;
}

... 2003/11/05(水) 22:18:31
m_bContinue は volatile にしとかんとあかんな。

NEG(ねぐ) [E-Mail] [HomePage] 2003/11/06(木) 00:28:14
 CProgressDlgを使った例。(^_^;
http://www24.cds.ne.jp/~neg/pro/piyo1/cpd/make.html

冬夜 2003/11/06(木) 08:49:33
for分の中にPeekMessageを入れれば
イイと思います。

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

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

#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 2003/11/07(金) 11:11:12
[[解決]]
をよよさん、ありがとうございます。
試してみましたが、まさにこの機能でした。
プログラムもシンプルで、これならすぐ応用して作れそうです。
丁寧な説明本当にありがとうございました。

古いスレッドには追加発言できません。