回答編集履歴

1

追記

2017/12/28 06:40

投稿

can110
can110

スコア38266

test CHANGED
@@ -45,3 +45,77 @@
45
45
  とあるように、その動作は保証されません。
46
46
 
47
47
  別スレッド側ではウインドウハンドル経由でアクセスされているのであれば問題ありませんが。
48
+
49
+
50
+
51
+ 別スレッド処理について追記
52
+
53
+ --
54
+
55
+
56
+
57
+ えーと。
58
+
59
+
60
+
61
+ - メンバ関数をそのままAfxBeginThreadのスレッド関数として渡す
62
+
63
+ - (したがって)別スレッド側で`this`ポインタでダイアログインスタンスにアクセスする
64
+
65
+
66
+
67
+ のはまずいです。詳細は`AfxBeginThread member function`などで検索してみてください。
68
+
69
+ この問題には目をつぶったうえで`GetPos`が無反応になる原因としては`Harahira`さんの指摘のとおりと推察します。
70
+
71
+ `GetPos`は、内部ではスライダーコントロールに対してのメッセージ処理が行われていますが、メイン側のダイアログでメッセージループ処理が行われていないため、処理が止まっていると思います。
72
+
73
+
74
+
75
+ とりあえず以下のような関数を定義し`OnDestroy`内での終了待ちループ内で呼び出せば`GetPos`動作すると思われます(動作未検証)
76
+
77
+ ```C++
78
+
79
+ void PumpMessage( void)
80
+
81
+ {
82
+
83
+ MSG msg;
84
+
85
+ while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)){
86
+
87
+ TranslateMessage(&msg);
88
+
89
+ DispatchMessage(&msg);
90
+
91
+ }
92
+
93
+ }
94
+
95
+ ```
96
+
97
+ が、これは悪手です。
98
+
99
+
100
+
101
+ 根本的には、以下のように処理を見直したほうがよいです。
102
+
103
+
104
+
105
+ - メイン側とサブ側の両方からアクセスできる`スライダー位置変数`を用意する。(`m_exitFlagAnotherThd `のような)
106
+
107
+ - メイン側にスライダーの位置変更ハンドラを追加し、ハンドラ関数では`位置変数値`を更新する。
108
+
109
+ - サブ側では`位置変数値`の参照のみを行う。
110
+
111
+
112
+
113
+ 基本的には、サブ側スレッドは
114
+
115
+ - メイン側で設定された変数値の参照だけを行う。
116
+
117
+ - メイン側への何らかの通知は、ユーザー定義メッセージをPostなりでおこなう
118
+
119
+
120
+
121
+ ほうが、今回のような問題が発生せず、構造が簡易になります。