処理中ダイアログ表示中にタスクバーが効かない

解決


ゆかりの  2006-03-17 01:34:59  No: 60957

メインウィンドウの処理ボタンを押すと、とある処理を行うプログラムです。
処理中にはモードレスダイアログで処理中表示とプログレスバーでの進捗状態を表示し、処理終了時にDestroyWindow()しています。
その処理中ダイアログ表示中に他のウィンドウで隠し、タスクバーをクリックしても、表示されません。
上に乗せたウィンドウを移動させた時には再描画されるのですが、タスクバーのクリック時には再描画されません。
処理中ダイアログ作成時に何か設定が必要なのでしょうか?
ちなみに、処理中の処理はthreadで動作しています。

初心者ゆえ、初歩的質問だったらすみません。
あちこち調べてみたのですが解りませんでした。
アドバイスお願いします m(_ _)m


YuO  2006-03-17 03:48:09  No: 60958

スレッドを起動したあと,ダイアログプロシージャからちゃんと抜けていますか?
UIスレッドの制御がWindowsに戻っていないのではないかと思われます。


ryo  2006-03-17 06:42:35  No: 60959

「メインウィンドウ」
「処理スレッド」
「表示ダイアログ」
の計3つの関係はどうなってるでしょうか?

A「メインウィンドウから処理スレッドをつくる。
    さらに、その処理スレッド内から表示ダイアログをつくる」

B「メインウィンドウから、処理スレッドと表示ダイアログの2つを別々に造り、
    処理スレッドの情報を、表示ダイアログになんらかの形で受け渡して表示」


ゆかりの  2006-03-17 19:24:14  No: 60960

解決する事が出来ました。
処理スレッド内でプログレスバーの更新&UpdateWindowを行っている箇所に
if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
    ::TranslateMessage(&msg);
    ::DispatchMessage(&msg);
}
を追加したら上手くいきました。

以下はお返事です。

>YuOさま
クラスを作ってCreateする形式なので、ダイアログプロシージャとかはないです。

>ryoさま
3つの関係は、Aです。

発言ありがとうございました m(_ _)m
お手を煩わせてしまって申し訳ありません。


kure  2006-03-17 19:45:02  No: 60961

もうみてないかもしれませんが・・・。

> クラスを作ってCreateする形式なので、ダイアログプロシージャとかはないです。

これは大間違い。
MFCは単にWin32をクラスというかたちでラッピングしてるだけで、
内部の機構が変わるわけではありません。
Win32のダイアログプロシージャはMFCでのOnXXXにあたります。

> 処理スレッド内でプログレスバーの更新&UpdateWindowを行っている箇所に
> if (::PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
>     ::TranslateMessage(&msg);
>     ::DispatchMessage(&msg);
> }

これでも動きますが良い設計とは言えません。
場当たり的な対処は後の改修などをし辛くさせます。
本来は処理スレッドとダイアログ用のスレッドを分けるか
イベントハンドラ内でブロックしないようにすべきです。
またはメインダイアログ用のスレッドに処理中ダイアログの
表示などを統合したり、
メインダイアログのスレッド・処理スレッド・処理中ダイアログのスレッド
の3つのスレッド構成にすべきです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加