回答編集履歴

2

少し修正

2017/05/31 08:31

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -42,7 +42,7 @@
42
42
 
43
43
 
44
44
 
45
- この仕組みから、モーダル・ダイアログを、その親ウィンドウと異なるスレッドで生成いけないと言うことと思います。
45
+ この仕組みから、モーダル・ダイアログを、その親ウィンドウと異なるスレッドで生成する場合はメイン・スレッドはメッセージ・ループを回っていないといけないと言うことと思います。
46
46
 
47
47
 
48
48
 

1

追記

2017/05/31 08:31

投稿

Chironian
Chironian

スコア23272

test CHANGED
@@ -25,3 +25,45 @@
25
25
  スマートな対策はhmmmさんの回答のようにサブ・スレッドでウィンドウを生成して、それに対してメッセージ・ループで処理することです。
26
26
 
27
27
  MFC経由でも同様な処理はできるかも知れませんが、ちょっと私にはわかりません。
28
+
29
+
30
+
31
+ ---
32
+
33
+ 【追記】
34
+
35
+ > 次に、モーダル・ダイアログのウィンドウは、通常はメイン・スレッドが生成しますので、そのウィンドウ・メッセージはメイン・スレッドのキューへ届きます。
36
+
37
+
38
+
39
+ 通常はこの通りですが、ご提示されたソースでは、サブスレッドで生成しようとしているようですね。
40
+
41
+ そして、DoModal()が親ウィンドウ(たぶんメイン・ウィンドウ)へEnableWindow()しており、親ウィンドウはメイン・スレッドで生成しているから応答できず、そこでハングアップということのようです。
42
+
43
+
44
+
45
+ この仕組みから、モーダル・ダイアログを、その親ウィンドウと異なるスレッドで生成してはいけないと言うことと思います。
46
+
47
+
48
+
49
+ 対策するなら、以下でできそうな印象です。
50
+
51
+
52
+
53
+ ①メイン・スレッドの長時間処理に入るところで、EnableWindow(.., false);
54
+
55
+ ②サブ・スレッドでモードレスダイアログを表示して進捗表示
56
+
57
+ ③メイン・スレッドの長時間処理を抜ける(終了やキャンセル)したところで、EnableWindow(..., true);
58
+
59
+
60
+
61
+ 実際にやったことはないので外していたらごめんなさい。
62
+
63
+
64
+
65
+ モードレスダイアログがちゃんとメイン・ウィンドウより上に表示できないかも知れません。
66
+
67
+ HWND_TOPMOSTとか使わないといけないかも?
68
+
69
+