teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

少し修正

2017/05/31 08:31

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -20,7 +20,7 @@
20
20
  通常はこの通りですが、ご提示されたソースでは、サブスレッドで生成しようとしているようですね。
21
21
  そして、DoModal()が親ウィンドウ(たぶんメイン・ウィンドウ)へEnableWindow()しており、親ウィンドウはメイン・スレッドで生成しているから応答できず、そこでハングアップということのようです。
22
22
 
23
- この仕組みから、モーダル・ダイアログを、その親ウィンドウと異なるスレッドで生成してはいけないと言うことと思います。
23
+ この仕組みから、モーダル・ダイアログを、その親ウィンドウと異なるスレッドで生成する場合メイン・スレッドはメッセージ・ループを回ってないといけないと言うことと思います。
24
24
 
25
25
  対策するなら、以下でできそうな印象です。
26
26
 

1

追記

2017/05/31 08:31

投稿

Chironian
Chironian

スコア23274

answer CHANGED
@@ -11,4 +11,24 @@
11
11
  結果、ハングアップということと思います。
12
12
 
13
13
  スマートな対策はhmmmさんの回答のようにサブ・スレッドでウィンドウを生成して、それに対してメッセージ・ループで処理することです。
14
- MFC経由でも同様な処理はできるかも知れませんが、ちょっと私にはわかりません。
14
+ MFC経由でも同様な処理はできるかも知れませんが、ちょっと私にはわかりません。
15
+
16
+ ---
17
+ 【追記】
18
+ > 次に、モーダル・ダイアログのウィンドウは、通常はメイン・スレッドが生成しますので、そのウィンドウ・メッセージはメイン・スレッドのキューへ届きます。
19
+
20
+ 通常はこの通りですが、ご提示されたソースでは、サブスレッドで生成しようとしているようですね。
21
+ そして、DoModal()が親ウィンドウ(たぶんメイン・ウィンドウ)へEnableWindow()しており、親ウィンドウはメイン・スレッドで生成しているから応答できず、そこでハングアップということのようです。
22
+
23
+ この仕組みから、モーダル・ダイアログを、その親ウィンドウと異なるスレッドで生成してはいけないと言うことと思います。
24
+
25
+ 対策するなら、以下でできそうな印象です。
26
+
27
+ ①メイン・スレッドの長時間処理に入るところで、EnableWindow(.., false);
28
+ ②サブ・スレッドでモードレスダイアログを表示して進捗表示
29
+ ③メイン・スレッドの長時間処理を抜ける(終了やキャンセル)したところで、EnableWindow(..., true);
30
+
31
+ 実際にやったことはないので外していたらごめんなさい。
32
+
33
+ モードレスダイアログがちゃんとメイン・ウィンドウより上に表示できないかも知れません。
34
+ HWND_TOPMOSTとか使わないといけないかも?