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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
家の中でのこだわりスペースはどこですか?
自分の家で快適に過ごすために工夫しているスペースはありますか? 例)ベランダでお茶を飲むためのカフェテーブル ゲーミングに特化したこだわりのPCスペース
-
大人になっても苦手な食べ物、ありますか?
大人になっても、我慢してもどうしても食べれないほど苦手なものってありますよね。 あなたにとっての今でもどうしても苦手なものはなんですか?
-
CDの保有枚数を教えてください
ひとむかし前はCDを買ったり借りたりが主流でしたが、サブスクで簡単に音楽が聴ける今、CDを手に取ることも減ってきたかと思います。皆さんは2024年現在、何枚くらいCDをお持ちですか?
-
【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
【お題】 ・買ったばかりの自転車を分解してひと言
-
好きな「お肉」は?
牛肉、豚肉、鶏肉、ラム肉、クマやシカの狩猟肉……。 いろ〜んな肉が食べられるようになりましたよね。 あなたがこれまで食べて「これはうまい!」とか「なんじゃこりゃ!」と好きになったお肉を教えてください。
-
ビジュアルC++でボタンの有効/無効
C言語・C++・C#
-
ボタンの表示の色、フォントを変更したい
C言語・C++・C#
-
CStringのFindで文字列検索を行いたいのですが
C言語・C++・C#
-
-
4
画面を強制的に再描画させる方法
C言語・C++・C#
-
5
CStringからchar*への型変換について教えてください。
C言語・C++・C#
-
6
【MFC】イベントの無効化について
C言語・C++・C#
-
7
VisualStudio MFC変数が追加できない
C言語・C++・C#
-
8
VC++2010のラジオボタンの選択されている読取
C言語・C++・C#
-
9
CWnd::EnableWindow()の扱い方
C言語・C++・C#
-
10
MFC ダイアログ上のID取得について
C言語・C++・C#
-
11
CStringをwchar_tに変換したい
C言語・C++・C#
-
12
CStringの文字列検索&抜き出しについて
C言語・C++・C#
-
13
マウスのクリックを無視したい
C言語・C++・C#
-
14
エディットボックスの入力制限について
C言語・C++・C#
-
15
ボタンクリックイベント 重複防止について
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA(エクセル)で自動的にボタン...
-
VBA シートのボタン名を変更し...
-
ボタンをマウスで押し続けたと...
-
コマンドボタンやイメージにマ...
-
ユーザーフォームに別シートか...
-
フォームの再読み込み
-
VBA CommandButtonの文字ずれ
-
TextBoxでEnterキーを押すと、...
-
ボタンの枠線の様なものを消したい
-
セルをマクロのボタンにしたい。
-
ASP.Net ラベルの内容をすぐに...
-
プロシージャからイベントをコ...
-
[Excel VBA]コマンドボタンの入...
-
VBAのボタンの位置が変わって困...
-
[VB.net] ボタン(Flat)のEnable...
-
Excel VBA実行中にワークシート...
-
見えないボタンを作って、押さ...
-
他のアプリケーションとの連携
-
Excel マクロ 閉じるボタン
-
GetCheck()
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA シートのボタン名を変更し...
-
VBA(エクセル)で自動的にボタン...
-
ユーザーフォームに別シートか...
-
VBA CommandButtonの文字ずれ
-
フォームの再読み込み
-
コマンドボタンやイメージにマ...
-
Excel VBA Application.caller...
-
アイコンとボタンの違い
-
ボタンをマウスで押し続けたと...
-
閉じると「+」になり開くと「-...
-
セルをマクロのボタンにしたい。
-
VBA マクロでの網掛けについて
-
VB.net でトグルボタンを実現し...
-
VBAのボタンの位置が変わって困...
-
Access VBA でデータペーストを...
-
VBAで多数のプログラムを一つの...
-
プロシージャからイベントをコ...
-
VBA でのボタンの移動について
-
[Excel VBA]コマンドボタンの入...
-
VBAでオプションボタンによって...
おすすめ情報