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

回答編集履歴

3

AttachThreadInput の記述を訂正

2018/11/06 17:10

投稿

atata0319
atata0319

スコア881

answer CHANGED
@@ -10,7 +10,8 @@
10
10
 
11
11
  ただし、子ウィンドウが所属するスレッドは子ウィンドウが破棄されるまで持続する必要があります。そのため親ウィンドウの WM_NCDESTROY メッセージで子ウィンドウが所属するスレッドを破棄したりします。親ウィンドウの WM_DESTROY が終了した時点で子ウィンドウは破棄されているため、破棄タイミングを調整するのに WM_NCDESTROY を使用することになります。
12
12
 
13
- 親ウィンドウの所属するスレッドと子ウィンドウの所属するスレッドでフォーカスの授受がうまいこと行かないパターンがあるので、AttachThreadInput でスレッド間のメッセージキューの同期をとる必要があります。この制御を完璧にやろうとするとけっこうめんどうくさいです。
13
+ ~~親ウィンドウの所属するスレッドと子ウィンドウの所属するスレッドでフォーカスの授受がうまいこと行かないパターンがあるので、AttachThreadInput でスレッド間のメッセージキューの同期をとる必要があります。この制御を完璧にやろうとするとけっこうめんどうくさいです。~~
14
+ 気のせいでした。AttachThreadInput が必要になるのはトップレベルウィンドウが異なる場合のみです。別スレッドの子ウィンドウには問題なくフォーカス移動できました。
14
15
 
15
16
  他にアクセラレーターを処理する際、子ウィンドウの所属するスレッドからメインスレッド側に伝達する必要があったりします。子ウィンドウ側でアクセラレーターを処理する場合はその逆の処理が必要です。
16
17
 

2

アクセラレーターについて追記

2018/11/06 17:10

投稿

atata0319
atata0319

スコア881

answer CHANGED
@@ -11,4 +11,7 @@
11
11
  ただし、子ウィンドウが所属するスレッドは子ウィンドウが破棄されるまで持続する必要があります。そのため親ウィンドウの WM_NCDESTROY メッセージで子ウィンドウが所属するスレッドを破棄したりします。親ウィンドウの WM_DESTROY が終了した時点で子ウィンドウは破棄されているため、破棄タイミングを調整するのに WM_NCDESTROY を使用することになります。
12
12
 
13
13
  親ウィンドウの所属するスレッドと子ウィンドウの所属するスレッドでフォーカスの授受がうまいこと行かないパターンがあるので、AttachThreadInput でスレッド間のメッセージキューの同期をとる必要があります。この制御を完璧にやろうとするとけっこうめんどうくさいです。
14
+
15
+ 他にアクセラレーターを処理する際、子ウィンドウの所属するスレッドからメインスレッド側に伝達する必要があったりします。子ウィンドウ側でアクセラレーターを処理する場合はその逆の処理が必要です。
16
+
14
- なお、本題からはやや外れますがマルチスレッド(マルチプロセス)な ActiveX コントロール(正確には OLE オブジェクト)はこれとは別の手段でスレッド間の同期とります。
17
+ なお、本題からはやや外れますがマルチスレッド(マルチプロセス)な ActiveX コントロール(正確には OLE オブジェクト)はアクセラレーターやフォーカスを処理するための手段を提供しています。

1

誤字の修正

2018/11/06 03:08

投稿

atata0319
atata0319

スコア881

answer CHANGED
@@ -1,5 +1,5 @@
1
- GUI アプリケーションをマルチスレッド化する意義とは GUI の応答を担保するためにブロック処理(スレッドの実行を中段する処理)をバックグラウンドで動作させることにあります。そのため、同一の GUI に所属するウィンドウをマルチスレッドで動作せる意はほとんどありません。
1
+ GUI アプリケーションをマルチスレッド化する意義とは GUI の応答を担保するためにブロック処理(スレッドの実行を中段する処理)をバックグラウンドで動作させることにあります。そのため、同一の GUI に所属するウィンドウをマルチスレッドで動作せる意はほとんどありません。
2
- ただし、例外として OpenGL 等のようにレンダリングを担当するコンポーネントをマルチスレッドで動作させることはあります。
2
+ 例外として OpenGL 等のようにレンダリングを担当するコンポーネントをマルチスレッドで動作させることはままあります。
3
3
 
4
4
 
5
5
  上記を踏まえても回答のほとんどは Chironian さんが述べられている通りです。回答されていない部分を補足します。