2011-01-13 22 views
0

CreateWindow()関数を使って作成したウィンドウ上にウィンドウを作成し、画像表示(SetTimer()に基づくアニメーションのような)を表示したい。しかし、それは別のスレッドで作成され、ユーザーがこれを閉じるまで生き続ける必要があります。私はしようとしたが失敗した。vC++の子スレッドでウィンドウを作成

EDITED

私はちょうど私が私がWindow Procedureが呼び出さ取得するときに知ってほしい、このリンクHow To Create Windows in a Multithreaded Applicationが、一つのことを発見したグーグル。それが私のchild threadからそれをどのように呼び出すことができるかシステムによって呼び出された場合。

+0

あなたは何を試しましたか? –

+0

まあ、私は3つの関数1> 'showWindow()'を作成し、ウィンドウとディスプレイ(子スレッドから呼び出される)を作成しました。 2> 'SetTimer()'を実行すると、画像を読み込むための時間間隔(500ms)を設定できます(子スレッドから呼び出されます)。 3> LoadImage() '(WindowsProc'の' WM_PAINT'イベントから呼び出される)イメージを読み込みます。しかし、私のウィンドウはフリーズしていて、カーソルはビジーアイコンを表示しています。 –

答えて

1

Windows(HWNDで表される)は、スレッドアフィニティを持っています。それらのWindowProcは、作成されたスレッドのコンテキストで常に呼び出されます。

このように、PostMessage APIとSendMessage APIをアプリケーションの任意のスレッドから呼び出すことができるため、スレッド間の呼び出しをシリアライズする便利な方法ですが、WindowProcは元のスレッドのコンテキストで実行されます。

WM_TIMERメッセージキューに投稿されたメッセージはSetTimerの仕組みなので、マルチスレッドアプリケーションでSetTimerを呼び出すときには注意が必要です。タイマーメッセージは呼び出しスレッドによって処理されます(hwndパラメータがNULLの場合) )またはウィンドウのスレッド。

また、結果として、ウィンドウを作成するスレッドやタイマーを処理したいスレッドごとにメッセージループを慎重に置く必要があります。

+0

子スレッドから 'WindowProc'を呼び出す方法を教えてください。 –

+0

私が言ったように - SendMessageまたはPostMessageをWindowsスレッドとは異なるスレッドから呼び出すと、WindowProcは独自のスレッドで呼び出されます。 –

1

メインのWindowsスレッドでユーザーインターフェイスを維持します。 Windows APIを使用してタイマーを設定すると、追加のスレッドは必要ありません(WndProcはタイマーメッセージWM_TIMERを取得します)。

実行するタスクが長くても、追加のスレッドを使用する必要がある場合でも、メインスレッドでウィンドウを維持し、ワーカースレッドで作業し、メインスレッドに更新でポストバックします。

+0

なぜ私はそうしているのか教えてください。私は実際に私はユーザー名、パスワード、ドメインボックスのような追加のcontolsを追加したWindowsログイン(何らかの顔検出)でウェブカメラから撮影した画像を表示する必要があります。その時間に 'CreateWindow'を呼び出すと、コントロールが表示されません。私は、カスタムウィンドウを閉じた後にLogin UIのコントロールしか表示しません。 –

関連する問題