ボタン押下による処理の割り込みについて

[戻る]
マグオ 2005/01/27(木) 20:01:29
こんばんわ。本日2回目の質問です。度々すみません。

現在、ダイアログベースでダイアログ上のスタートボタンを押下するとシリアル通信を
開始するとともにデータを受信し、ストップボタンを押すと通信を停止するものを作っ
ています。
処理的には
□スタートボタン押下処理
void CMainDlg::OnBtnStart()
{
    g_bCancelFlag = TRUE;    // g_bCancelFlagはグローバル変数です
    while( 1 ){
        if ( g_bCancelFlag = FALSE ){
             break;
        }
        シリアル受信処理
    }
}
□ストップボタン押下処理
void CMainDlg::OnBtnStop()
{
    g_bCancelFlag = FALSE;
}
予想はしていたのですが、この状態で実行すると「スタート」ボタン押下後、無限ルー
プとなり、「ストップ」ボタンを押下することが出来ません。
このような処理を行う場合、VC++ではどういった制御にするのがよいでしょうか?
ご指導よろしくお願いします。

KING・王 2005/01/27(木) 20:12:52
> このような処理を行う場合、VC++ではどういった制御にするのがよいでしょうか?
> ご指導よろしくお願いします。

シリアル受信処理をスレッド化するのが一般的だと思います。

>    while( 1 ){
>        if ( g_bCancelFlag = FALSE ){
>             break;
>        }
>        シリアル受信処理
>    }

この部分をスレッドに記述するようにし、CMainDlg::OnBtnStart()では、そのスレッドを起動
するようにすれば、
マグオさんの望んでいる動作になると思います。
ただし、シリアル受信処理中に、再度CMainDlg::OnBtnStart()が実行された場合に、
スレッドを起動しないような対策は必要だと思います。

マグオ 2005/01/27(木) 20:23:01
KING・王さん ありがとうございます。

まだVCを始めたばかりでスレッドについて詳しいことが分からないのですが、スレッ
ドに記述することで停止処理を行うのは現状のようにグローバルで定義したフラグを変
えるという処理で可能なのでしょうか?

>  ただし、シリアル受信処理中に、再度CMainDlg::OnBtnStart()が実行された場合に、
>  スレッドを起動しないような対策は必要だと思います。
このような場合は、通信中はスタートボタンを無効にするようにすればよいでしょう
か?

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