VC++ 2005 MFC ボタンの無効化
現在スレッドを使ったプログラムを作成しています。
あるボタンを押すと、
親スレッド
1、RS232C受信スレッドを作成
2、RS232Cにデータを送信
3、WaitSingleObjectでイベント待ち
4、受信状態に応じた処理
子スレッド
1、サムチェック等確認して、受信が完了すれば
受信データを格納してCEventのSetEventを発行
というような処理の部分があるのですが、待っている間にウィンドウ内にある
ボタンが押せてしまいます。厳密には、イベント待ちを抜けた時点で待っている
間に押せてしまったボタンの処理が走ってしまうのですが。
EnableWindow(FALSE)をやっても駄目でした。
何かいい方法がありませんか??すいませんがよろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
>ちなみにワーカスレッドでイベントを待ってイベント受信でEnableWindow
>っていう形になるのでしょうか??
>どこで何をしてっていうのが、すいません想像付いていません。
ボタンのイベントハンドラに入ったら…
・EnableWindow(FALSE)として、ボタンを無効化します。
・ワーカースレッドを起動します。
(ワーカースレッドにはボタンのHWNDを引き渡すようにします)
スレッド起動時に引き渡せるのはLPVIODが1つだけですが、
構造体のアドレスを渡すこともできますので、必要なデータを詰めた構造体のアドレスでも渡して下さい。
# その構造体の寿命には注意。イベントハンドラ内のローカル変数だと危険です。
# 動的確保して渡してワーカースレッド中で解放する等の工夫を。
・ワーカースレッドの起動が完了したらイベントハンドラは終了します。
ワーカースレッドは…元質問の「親スレッド」の内容を内包します。
終了してスレッドを終了する際に、EnableWindow(TRUE)でボタンを有効化します。
子スレッドはそのままでよいでしょう。
注意点としては…ワーカースレッドが終了する前にウィンドウを閉じられた場合の対策が必要。
BeginThread()ではCランタイムライブラリの使用が危険になる。
MFCの場合CWndなどはスレッドMatthewで受け渡しはできない(はず)。
などなど……。
まぁ、検索してみると、UIスレッドとワーカースレッドで切り離ししているサンプルとか見つかる…
でしょう。たぶん。
# よくあるネタですし。
No.2
- 回答日時:
親スレッドの1~4までの処理が「イベントハンドラ内で」実行しているのであれば、
当然の動作です。
# イベントハンドラからの戻りが遅ければ、OSによって「応答なし」のラベルを付与して貰えるでしょう。
ボタンクリックが発生
->WM_COMMANDでイベント通知
->EnableWindow(FALSE)で、ボタンを無効化
->ループ処理などでイベント処理(この間もマウスボタン押下できますが、ソレはキューに溜められる(*1))
->EnableWindow(TRUE)で、ボタンを有効化
->キューに溜まってる処理を続行
->*1でのマウスボタン押下のメッセージから、ボタン押下を検出、WM_COMMANDがキューに入る(EnableWindow(TRUE)で有効化されているから)
->WM_COMMANDでまたまた通知
ボタン押下でループ処理を実行するワーカースレッドを起こして、そのスレッド側でEnableWindow()を使ってボタンの有効/無効をコントロールした方が良いでしょう。
なお、ワーカースレッド実行中にウィンドウが閉じられてしまう。という可能性もありますのでご注意を。
この回答への補足
返事が遅くなって申し訳ありません。
確かにそういった動きをしています。
EnableWindowではなくフラグでも同様の動きをしてしまいます。
ちなみにワーカスレッドでイベントを待ってイベント受信でEnableWindow
っていう形になるのでしょうか??
どこで何をしてっていうのが、すいません想像付いていません。
No.1
- 回答日時:
ボタンクリックイベントハンドラに有効判定処理をいれて、その処理が開始したら、その処理が終了するまでクリックイベントを無視する方法はどうですか?
こんな感じです。
void CTestDialog::OnBtn1()
{
if(btn1.IsWindowEnabled())
{
btn1.EnableWindow(FALSE);
// ボタンクリック時処理
btn1.EnableWindow(TRUE);
}
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- HTML・CSS htmlで画面遷移させたい 1 2022/10/28 18:19
- プリンタ・スキャナー キャノンmp490プリンター【エラー番号5400】で【プリンタートラブルが発生しました。電源を入れ直 2 2023/07/24 17:45
- Excel(エクセル) excelvbaのenableeventsについて 3 2022/08/30 11:20
- Excel(エクセル) マクロで謎の現象が起きていて困ってます。 エクセルで作ったボタンを押すとマクロが動いて処理をしてくれ 3 2023/06/22 17:28
- JavaScript ①入力フォーム→②確認表示画面→③送信完了画面のコードを書いているのです、 入力フォームから受け取っ 2 2022/05/10 16:45
- C言語・C++・C# TCP/IP通信時のサーバーからの受信 2 2022/11/23 09:11
- その他(ネットショッピング・通販・ECサイト) paypayフリマでほぼ未使用品というテプラを購入しました。即日発送してもらったのですぐ到着したんで 4 2022/07/27 07:19
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- その他(学校・勉強) この中で間違ってある説明はありますか?詳しい方に教えていただきたいです。 A. 1つのプログラムが複 2 2023/07/14 01:15
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教えるわが家の防犯対策術!
ホームセキュリティのプロが、家庭の防犯対策を真剣に考える 2組のご夫婦へ実際の防犯対策術をご紹介!どうすれば家と家族を守れるのかを教えます!
-
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
画面を強制的に再描画させる方法
C言語・C++・C#
-
-
4
テキストボックスからフォーカス外す
C言語・C++・C#
-
5
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
6
MFCでコンボボックスを選択不可状態にしたい
C言語・C++・C#
-
7
CFileDialogの最初のディレクトリ設定
C言語・C++・C#
-
8
MFCのタイマーのつかい方を教えてください
C言語・C++・C#
-
9
エディットボックスの入力制限について
C言語・C++・C#
-
10
VisualStudio MFC変数が追加できない
C言語・C++・C#
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
ボタンをマウスで押し続けたと...
-
セルをマクロのボタンにしたい。
-
ASP.Net ラベルの内容をすぐに...
-
フォームの再読み込み
-
ボタン
-
VBAのボタンの位置が変わって困...
-
Excel VBA ボタンを非アクティ...
-
VB 電卓 数字キーを押して...
-
C#でExcel上にボタンを作成したい
-
テラパッドを使ってるんですが...
-
VBA CommandButtonの文字ずれ
-
VBAで多数のプログラムを一つの...
-
excel シート上のボタンが動かない
-
VB.net でトグルボタンを実現し...
-
ユーザーフォームに別シートか...
-
MS-OUTLOOK VBA 投票ボタン
-
コマンドボタンの長押し
-
コマンドボタンの文字色
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
フォームの再読み込み
-
ユーザーフォームに別シートか...
-
VBA CommandButtonの文字ずれ
-
セルをマクロのボタンにしたい。
-
Excel VBA Application.caller...
-
コマンドボタンやイメージにマ...
-
Access VBA でデータペーストを...
-
VBAのボタンの位置が変わって困...
-
ボタンをマウスで押し続けたと...
-
ボタン
-
C#プログラムで、ボタンをショ...
-
VBA でのボタンの移動について
-
閉じると「+」になり開くと「-...
-
ダウンロードダイアログをVB...
-
[Excel VBA]コマンドボタンの入...
-
ASP.Net ラベルの内容をすぐに...
-
プロシージャからイベントをコ...
-
CommandButtonのCaptionを変化...
おすすめ情報