2011-01-15 18 views
0

ウィンドウを作成して更新するために子スレッドをコーディングしましたが、問題が発生しました。私のウィンドウは、スレッドの実行が完了した後に自動的に閉じます(自然に)。しかし、私はそれを閉じたいとは思わないので、whileループをスレッドに入れようとしました。そのループでは、InvalidateRect()関数を呼び出してウィンドウを更新できるようにしています。今すぐウィンドウが自動的に閉じていないが、私はそれを移動することはできませんし、カーソルとはまた、いくつかの忙しいアイコン(完全に応答しないことを示す)とカーソルを操作することはできません。どのように私はその問題を解決することができます。私は、ウィンドウを作成するためにmain()機能を使用することはできませんvC++を使用して子スレッドでウィンドウを作成し更新する方法

メインからこれを呼び出す()

bool CameraApp::OnInit() 
{ 
hThread = (HANDLE)_beginthreadex(NULL, 0, &CameraFrame::StartCameraPreview, 
    NULL, 0, &threadID); 
    WaitForSingleObject(hThread, INFINITE); 
    CloseHandle(hThread); 

    return TRUE; 
} 

unsigned __stdcall CameraFrame::StartCameraPreview(void* pArgs) 
{ 
cFrame.ShowCameraWindow(); 

while(1) 
{  
    cFrame.StartCapture(); 
    InvalidateRect(hwnd, NULL, false); 
    Sleep(5000); 
} 
_endthreadex(0); 
    return 0; 
} 

スレッド機能ブロック:以下のコードです。だから、私はスレッドを使用して定期的な画像をWebカメラから撮影したウィンドウを更新する必要があります。

答えて

2

無限ループの代わりに、Windowsメッセージを処理するセカンダリスレッドにメッセージポンプを作成する必要があります。

unsigned __stdcall CameraFrame::StartCameraPreview(void* pArgs) 
{ 
    cFrame.ShowCameraWindow(); 

    MSG msg; 
    while (GetMessage(&msg, NULL, 0, 0)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
    } 

    _endthreadex(0); 
    return 0; 
} 
+0

私はウィンドウを更新することができ、それはメッセージに従って更新されますか? –

+0

タイマーを作成し、毎秒ウィンドウを更新します。このメッセージループでWM_TIMERを処理したり、ウィンドウのwindow procを作成したりすることができます。 – DReJ

関連する問題