- ベストアンサー
スタティックテキストが表示されない
親ダイアログのボタンが押された際、 親ダイアログのCWnd*を渡して、Topmost=TRUEの プロパティを持つ子ダイアログを モードレスで表示させるようにしました。 子ダイアログは、スタティックテキストと アニメーションコントロールのみを配置した ダイアログで、OnInitDialogにてaviファイルを ロード・再生しています。 スタティックテキストはリソースへの埋め込みです。 ボタン押下後、ダイアログを表示させる関数を呼び、 その後、一定時間Sleepをさせるようにしました。 (時間のかかる処理の代わりに) 現象としては、ボタン押下後、子ダイアログは 表示され、アニメーションも子ダイアログ表示後、 1~2秒ほどで再生されるのですが(このタイムラグも若干不満)、 スタティックテキストが、親側のSleepが終わるまで 表示されません。 OnInitDialogでスタティックテキストを再設定してやるように してもダメでした。 回避策はありますでしょうか?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>スレッド側で処理を行うというのは、処理自体をワーカースレッドに移して >マルチスレッドで作成するということでしょうか? >(素人的な質問ですみません。。。) そうです。GUIに関係ない処理をワーカースレッドで処理します。 ボタン押下→ワーカースレッド起動→ボタン押下の処理終了 です。 GUI系のプログラムはすぐ処理を終わらしてメッセージループに戻ることを基本としてください。MFCだとなるべく早くメンバ関数の処理は終わらせる事が原則です。 そうしないと親と子のウィンドウ操作が処理が終わるまで何も出来ません。応答のないプログラムと見なされますよ。
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
>スタティックテキストが、親側のSleepが終わるまで >表示されません。 親側のSleep中は、プロセスのメッセージキューに溜まったメッセージは処理されません。 その溜まったメッセージの中に「スタティックテキストを描画して下さい」と言うメッセージが含まれている場合、親側のSleepが終るまで、スタティックテキストは描画されません。 スタティックテキストを再設定したとても、やはり「再設定されたので、スタティックテキストを再描画して下さい」ってメッセージがメッセージキューに溜まるだけで、スタティックテキストは描画されません。 メインスレッド(メッセージのキューイング処理をしているスレッド)で時間がかかる処理をする場合は、一旦、実行権を放棄して、メッセージキューが正しく処理されるようにしましょう。
- zwi
- ベストアンサー率56% (730/1282)
>本来、子ダイアログは、親が処理中ですよってことを >明示するためのダイアログでして、現在、テスト段階のため、 >親の処理が早く終わりすぎるため、処理自体をコメントアウトして >代わりにSleepをさせています。 Winアプリで長い処理はGUI系の操作が出来なくなるのでやっていけません。 もし長い処理が必要なら、長い処理はスレッド側でやらせてGUI側は常に待機状態と言うのが基本です。 スレッドとGUI側はメッセージ等で状況を伝え合うのが良いかと思います。
補足
スレッド側で処理を行うというのは、処理自体をワーカースレッドに移して マルチスレッドで作成するということでしょうか? (素人的な質問ですみません。。。)
- zwi
- ベストアンサー率56% (730/1282)
親がSleepしているのでWindowsメッセージが滞っているんだと思います。 そもそもGUI系でSleepはご法度です。 モードレスでSleepするぐらいならモーダル表示すべきだと思うんですが、なにか問題があるんでしょうか?
補足
本来、子ダイアログは、親が処理中ですよってことを 明示するためのダイアログでして、現在、テスト段階のため、 親の処理が早く終わりすぎるため、処理自体をコメントアウトして 代わりにSleepをさせています。
お礼
丁寧にお教え頂きありがとうございました。 基本を分かっていませんでした。 これからはマルチスレッドにてコーディングしてみます。