ボタン押下による処理の割り込みについて – プログラミング – Home

ボタン押下による処理の割り込みについて
 
通知
すべてクリア

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


マグオ
 マグオ
(@マグオ)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

こんばんわ。本日2回目の質問です。度々すみません。

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


引用解決済
トピックタグ
KING・王
 KING・王
(@KING・王)
ゲスト
結合: 20年前
投稿: 122
 

> このような処理を行う場合、VC++ではどういった制御にするのがよいでしょうか?
> ご指導よろしくお願いします。

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

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

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


返信引用
マグオ
 マグオ
(@マグオ)
ゲスト
結合: 20年前
投稿: 4
Topic starter  

KING・王さん ありがとうございます。

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

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