親ダイアログのボタンが押された際、
親ダイアログのCWnd*を渡して、Topmost=TRUEの
プロパティを持つ子ダイアログを
モードレスで表示させるようにしました。
子ダイアログは、スタティックテキストと
アニメーションコントロールのみを配置した
ダイアログで、OnInitDialogにてaviファイルを
ロード・再生しています。
スタティックテキストはリソースへの埋め込みです。
ボタン押下後、ダイアログを表示させる関数を呼び、
その後、一定時間Sleepをさせるようにしました。
(時間のかかる処理の代わりに)
現象としては、ボタン押下後、子ダイアログは
表示され、アニメーションも子ダイアログ表示後、
1~2秒ほどで再生されるのですが(このタイムラグも若干不満)、
スタティックテキストが、親側のSleepが終わるまで
表示されません。
OnInitDialogでスタティックテキストを再設定してやるように
してもダメでした。
回避策はありますでしょうか?
No.4ベストアンサー
- 回答日時:
>スレッド側で処理を行うというのは、処理自体をワーカースレッドに移して
>マルチスレッドで作成するということでしょうか?
>(素人的な質問ですみません。。。)
そうです。GUIに関係ない処理をワーカースレッドで処理します。
ボタン押下→ワーカースレッド起動→ボタン押下の処理終了
です。
GUI系のプログラムはすぐ処理を終わらしてメッセージループに戻ることを基本としてください。MFCだとなるべく早くメンバ関数の処理は終わらせる事が原則です。
そうしないと親と子のウィンドウ操作が処理が終わるまで何も出来ません。応答のないプログラムと見なされますよ。
No.3
- 回答日時:
>スタティックテキストが、親側のSleepが終わるまで
>表示されません。
親側のSleep中は、プロセスのメッセージキューに溜まったメッセージは処理されません。
その溜まったメッセージの中に「スタティックテキストを描画して下さい」と言うメッセージが含まれている場合、親側のSleepが終るまで、スタティックテキストは描画されません。
スタティックテキストを再設定したとても、やはり「再設定されたので、スタティックテキストを再描画して下さい」ってメッセージがメッセージキューに溜まるだけで、スタティックテキストは描画されません。
メインスレッド(メッセージのキューイング処理をしているスレッド)で時間がかかる処理をする場合は、一旦、実行権を放棄して、メッセージキューが正しく処理されるようにしましょう。
No.2
- 回答日時:
>本来、子ダイアログは、親が処理中ですよってことを
>明示するためのダイアログでして、現在、テスト段階のため、
>親の処理が早く終わりすぎるため、処理自体をコメントアウトして
>代わりにSleepをさせています。
Winアプリで長い処理はGUI系の操作が出来なくなるのでやっていけません。
もし長い処理が必要なら、長い処理はスレッド側でやらせてGUI側は常に待機状態と言うのが基本です。
スレッドとGUI側はメッセージ等で状況を伝え合うのが良いかと思います。
この回答への補足
スレッド側で処理を行うというのは、処理自体をワーカースレッドに移して
マルチスレッドで作成するということでしょうか?
(素人的な質問ですみません。。。)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA 参照先で選んだファイルをコピーし、出力先に別名で保存したい 8 2022/05/13 20:37
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Windows 10 MSアカウントの「個人設定をクラウドから削除します」は機能していないのでしょうか? 1 2022/11/20 17:01
- Visual Basic(VBA) エクセルのマクロについて教えてください。 2 2023/07/06 17:46
- その他(Microsoft Office) Office(Windows版,Word/Excel/PowerPoint等)にログインできません 4 2022/07/24 15:18
- Excel(エクセル) マクロでボタンにつける名前がどこに設定されているかわからないケースがありました。 1 2023/06/19 19:37
- 画像編集・動画編集・音楽編集 AfterEffectでのシャターの挙動がおかしい 1 2023/05/07 00:38
- JavaScript 空白で入力フォームのボタンをクリックしたら、ブラウザの上部からjavascriptで 表示されるアラ 1 2022/05/20 11:16
- その他(プログラミング・Web制作) pythonでアプリが終了されたときに特定の処理を実行したい 2 2023/01/19 17:13
- その他(ソフトウェア) UnityのPublishing SettingsでCreate Keyを押しても反応しない 1 2023/06/27 01:03
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
VBA kernel32 の意味
-
Application.ScreenUpdating=Fa...
-
VBA メッセージボックスを自動...
-
メッセージボックスのボタン名変更
-
Excel VBA 自動的に閉じるMsgBox
-
ボタンが押された事を検知する...
-
エクセルVBAでクリップボード内...
-
VBSで応答不要のメッセージボッ...
-
DoEvents
-
vb.netでバッチ処理
-
Excel VBA で処理中断(DoEvents...
-
ACCESS側からEXCELの書式を設定...
-
EXCEL VBA「Application.Displa...
-
VB6 コマンドボタン クリック...
-
VB6でフォームをリロードしたい
-
VBA、UserFormを前面に出力して...
-
VB.NETのUsingキーワードの使い方
-
【VB】超初歩的な質問
-
マウスのクリックを無視したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBSの処理中一旦処理を止めて再...
-
メッセージボックスのボタン名変更
-
ACCESS側からEXCELの書式を設定...
-
VBSで応答不要のメッセージボッ...
-
VBA kernel32 の意味
-
エクセルVBAでクリップボード内...
-
【C#】 あるイベントから別イ...
-
Excel VBA で処理中断(DoEvents...
-
VBA メッセージボックスを自動...
-
Application.ScreenUpdating=Fa...
-
Excel VBA 自動的に閉じるMsgBox
-
ASP.NETでのメッセージ画面を出...
-
メッセージBOXの「はい」「いい...
-
「キャンセル」ボタン付きの処...
-
B列に特定の文字列が入っている...
-
シャットダウン時のExcel強制終...
-
ASP VBScriptでスクリプト実行...
-
起動後直に実行するコードはど...
-
MFCのメニューバーのイベント取得
-
アクセスでのキー送信について
おすすめ情報