как создать и обновить окно в дочернем потоке, используя vc ++ - PullRequest
0 голосов
/ 15 января 2011

Я только что закодировал дочерний поток для создания и обновления окна, но столкнулся с некоторой проблемой. Мое окно закрывается автоматически после завершения этого потока (естественно). Но я не хочу закрывать его, поэтому я попытался поместить цикл 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 Ответ

2 голосов
/ 15 января 2011

Вместо вашего бесконечного цикла вам нужно создать насос сообщений во вторичном потоке, который обрабатывает сообщения 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;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...