2011-09-20 15 views
5

私は1つのスレッドでウィンドウを作成し、そのHWNDを実行する任意の数のスレッドの1つに移行させたいと考えています。私のプログラムには複数のウィンドウがあります。これが可能か、Win32 APIはこれ用に設計されていませんか?Win32ウィンドウはスレッドセーフですか?

+0

あるスレッドで何かを作成し、それを別のスレッドで削除したいのですが、そのアイデアに問題はありませんか? – AJG85

+1

@AJG: 'new' /' delete'では問題ありません。他のリソースについて驚くほど完全に合理的です。 – MSalters

+0

@MSalters:実装にもよりますが、ヒープ割り当てに関する記述はありませんでした。それが見落とされてしまった場合に備えて持ち出すだけでした。 – AJG85

答えて

6

いいえ、これはできません。ウィンドウがメッセージループのために使用するスレッド( "実行中"と呼ばれるもの)は、ウィンドウの作成時に定義されます。複数のスレッドを作成してそれらからメッセージループを開始することができます(したがって、それらにウィンドウを作成することもできます)。これは一般的に危険とみなされます。

+4

コメントしますか? –

+0

いくつかの男が一緒に来て、このページの下向きの矢印ですべてをdownvoted、私はそれを取り消そうとしました –

+1

ここでdownvoterではありませんが、私は知っていると思います:どのように/これはおそらく、高度な習慣であり、私が知っている危険なものではなく、普通のHello Worldや単純なダイアログアプリで行う必要はありません。それは多くの複雑なアプリケーション(エクスプローラ、IE、おそらくオフィス)で一般的なプラクティスです。 – BrendanMcK

2

いいえ、これらの呼び出しでは同時性チェックはありません。

9

はい、ある程度までです。

任意のスレッドからHWNDにメッセージを送信して送信できます。別のスレッドからUI(例えばコントロールを追加)を設定しようと

http://msdn.microsoft.com/en-us/library/ms644944(v=VS.85).aspx

はひどく終了します。ただし、ウィンドウにメッセージを送信すると、メッセージが作成スレッドで処理されることを確認できます。

+0

これは最も正しい答えです.Win32は実際にはクロススレッドアクセスに関するUIフレームワークの中で最も寛大です.Win32k.sysはすべての作業を行おうとします。しかし、あなたがこれを知らないふりをして、オブジェクトがスレッドアフィニティ化されているかのように動作することは、より良い考えです。 –

+0

はい。 「ほとんどの作品」は、私が書いたものと関連しているような説明ではありません:)。 Send/Postingメッセージ(または21世紀の対応者)に厳格ではない場合、奇妙なことが起こることがあります。 –

+0

メッセージの送信は私が興味を持ったものだったので、これはより良い答えです。 –

2

must be called from the same threadCreateWindowGetMessage(またはそれに相当するもの)の2つの重要な呼び出しがあります。あなたのソリューションはそうではないので、間違っています。

PostMessageに電話することができます。 SendMessageは、クロススレッドシナリオでブロックされ、デッドロックする可能性があるため、やや危険です。

+0

私は、ワーキングスレッド上のいくつかのコードがクリティカルセクションからSendMessageを呼び出してデッドロックした状況が発生しました。それを見て一時間を費やしてしまったので、処理をUIスレッドに置き、PostMessageの指示に従うことが賢明だと思った。 – locka

関連する問題