如何使用vc ++在子线程中创建和更新窗口

时间:2011-01-15 10:06:29

标签: multithreading visual-studio-2010 process visual-c++

我刚编写了一个子线程来创建和更新窗口,但我遇到了一些问题。完成线程执行后,我的窗口会自动关闭(自然)。但我不想关闭它,所以我尝试在线程中放置一个while循环,在该循环中我调用InvalidateRect()函数,以便它可以更新窗口。现在窗口没有自动关闭,但我无法移动它或与它交互,光标也显示一些忙碌的图标(意味着完全没有响应)。我怎么能解决这个问题。下面是代码:

从main()

调用此方法
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;
} 

我无法使用main()函数创建窗口。因此,我必须使用线程并使用从网络摄像头拍摄的周期性图像更新该窗口。

1 个答案:

答案 0 :(得分: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;
}