- ベストアンサー
スレッド中でウインドウのイベント(Windows)
カテゴリー違いかもしれませんが、 Windowsでスレッド中でウインドウを生成すると、 イベントの処理ができなくなります。 (たぶんもとのイベントループにメッセージがいって そこで終わっていると思うのですが) これを避ける方法とかあるのでしょうか? メインループにメッセージを送ってそこでウインドウを 生成してもらうのが由緒正しい方法なのでしょうか? 用語とかむちゃくちゃかもしれませんが よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
開発環境が判りませんが、VC系でMFC使用可能なら CWinThread クラス を使う事でメッセージループ付きのスレッドを作れます。 参考URL: http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vclib/html/_MFC_CWinThread.asp また、「ホントにそのスレッドで~~~する必要が有るの?」という 事を慎重に考えて設計しないとマルチスレッドの罠に嵌ります。 例えば motsuan さんの場合、ホントにそのサブスレッドから自前の ウィンドウ作って描画する必要が有るの? がポイントの1つです。 (要件的に、本当に必要なのかも知れませんが…) 別のアプローチとして、画面の生成や描画はメインスレッドに全てを 任せて、サブスレッドからは非同期処理の中で PostThreadMessage を 使いメインスレッドへ描画等の指示を送る、という方法は如何です? 但し PostThreadMessage は文字通り PostMessage なのでメッセージ を処理し終わったかどうかは判りません。 しかし、そのような同期取りが必要ならば尚更、メッセージによって タイミングを計るのは危険で、面倒でも一般的な同期オブジェクト等 を使う方が良いと思います。
その他の回答 (1)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
作成したスレッドの中で新たにメッセージループを作るんだと思いますが。
お礼
ご回答ありがとうございます。 状況の説明が不足しておりました。 Win32APIでスレッドをつくって、 Win32APIでウインドウを生成しています。 その際におきる症状が上記のものです。 ウインドウハンドルを使って メッセージを送ることはできるのですが、 イベント関係の連絡が上手くいきません。 現状、もとのウインドウでウインドウのイベントループにメッセージを送ってウインドウを生成しています。 Windows以外のOSへの移植も考えているので Windowsのシキタリに則った構造ではなく汎用性=「普通こうだろう」というのが分かればよいなと思い質問しました。 ともかく、お礼が遅くなってしまいましたが、ありがとうございました。
お礼
ご回答ありがとうございます。 下記のような状況なのですが、 インタープリタでスクリプトを読み込んで それに応じて、数値計算をやって (スクリプトに従ってウインドウを生成し) その結果をウインドウに描画しながら 人からのイベントを拾うようなことをやっています。 インタープリタ自体を別プロセスで動かしたいけど その制御や結果については人からの イベントにあわせて進めたいという考えで、 スレッドを使っています。 "Keep it simple and stupid"から離れつつあるような気がするので、ご指摘のとおり、本当に良い方法かどうか悩んでおります。 下記のように、現在はメインのスレッド(ウインドウのメッセージループ)にメッセージを送ってウインドウを生成し、それにメッセージを送って描画していますが、 なんとなく無理やりな感じがして質問してみました。 ともかく参考にさせていただきます。 いろいろ書かせていただいたので、他の方から回答が繰るかもと期待してもうちょっとだけ開いておきます。 お礼が遅くなって申し訳ありあませんが、もう少々お待ちください。