2017-01-01 7 views
1

私はWinAPIアプリケーション/ウィンドウを作成したいので、メッセージを待っている間に実行をブロックしたくないので、私は2つのスレッドを持つ予定です。メインスレッドとアプリケーションスレッドが含まれます。アプリケーションスレッドはウィンドウ(CreateWindowEx)を作成し、メッセージループでブロックします。WinAPIマルチスレッドアプリケーション

私の苦境は、アプリケーションの一部を変更したい主なスレッドから来ています。例えば、スタイル、サイズなどを変更する。アプリケーションをスレッドセーフに保つために、同じスレッドにその種のコードを保存することが最善であると思います。私の最初のアイデアは、メインスレッドからのメッセージを投稿して、アプリケーションスレッドがブロックを解除し、要求を処理して再びブロックできるようにすることです。しかし、別のスレッドからメッセージを送信するのが安全かどうか、私は確信が持てません。私が検討していない優れた解決策もあります。私は何か助けやフィードバックを感謝します。

+1

このタスクでは、2つ以上のスレッドを持つ必要はありません。 'MsgWaitForMultipleObjectsEx'ベースのメッセージループを使用してください – RbMm

+2

はい、スレッド間でメッセージを投稿(または送信)できます。 –

答えて

2

スレッド間でSendMessageおよび/またはPostMessageというメッセージを送信することは安全でサポートされています。

SendMessageは、他のスレッドがメッセージを処理している間に待機し、PostMessageは待機しません。 2つがあり間の他の違いはあるが、他のスレッドがメッセージを処理した前にバッファがスコープの外に出る可能性があるので、あなたのケースで覚えておくべき重要なことは、あなたが

... 
if (whatever) 
{ 
    char buffer[100]; 
    strcpy(buffer, "hello world"); 
    PostMessage(g_MyWindow, WM_APP, 0, (LPARAM) buffer); // BUG, must use SendMessage 
} 
... 

を行うことができないということです。

一般に、MoveWindowGetWindowRectのようなウィンドウを扱うすべてのWindows関数は、スレッドセーフです。それらのほとんどは、別のプロセスでWindows上で使用することもできます...

+0

いくつかの注記: '1'技術的にスレッドセーフですが、ウィンドウを作成したスレッドからウィンドウミューテーターを常に呼び出す必要があります。これは、例えば[DestroyWindow](https://msdn.microsoft.com/en-us/library/windows/desktop/ms632682.aspx)で明示されています。 '2'デッドロックを防ぐために' SendMessageTimeout'を使ってスレッド間でメッセージを送信する必要があります。 '3'' SendMessage'が目標を返すのを待っている間も、それはインバウンドのクロススレッドメッセージをディスパッチします。 – IInspectable

+0

@IInspectableはい他のスレッドへのSendMessageは危険です。ターゲットがメッセージを処理していないが、他のプロセスを扱うときには、通常、あなた自身のコードにバグがないと仮定しているだけです);ワーカースレッドからUIスレッドが問題になることはありません。 – Anders

+0

プロセス内でスレッドが実行されているだけであっても、それが自分のコードであるとは限りません。 – IInspectable

関連する問題