Entendiendo MsgWaitForMultipleObjects

Tengo un hilo gui principal que quiero seguir respondiendo a las acciones de los usuarios, como mover el diálogo, cambiar el tamaño, etc., mientras tengo un hilo de fondo haciendo alguna tarea. En el pasado, he usado WaitForSingleObject con un tiempo de espera para procesar eventos de la interfaz gráfica de usuario mientras esperaba que se completara el subproceso en segundo plano. Recientemente leí sobre MsgWaitForMultipleObjects que parecía estar resolviendo el problema que tenía un poco más limpio.

¿Alguien puede decirme los errores en el siguiente código y dónde me voy a equivocar aquí? La interfaz gráfica de usuario no responde cuando hago clic en el botón para iniciar el hilo. Hice una aplicación de diálogo con un avi que se está reproduciendo en el hilo principal de la interfaz de usuario. Tengo un botón para iniciar un subproceso y uso MsgWaitForMultipleObjects para esperar en el identificador del subproceso, pero permitir que todos los mensajes se procesen hasta que se rompan cuando el subproceso finaliza / señala.

Gracias.

UINT MyThreadProc( LPVOID pParam )
{
    ThreadData* pObject = (ThreadData*)pParam;

    if (pObject == NULL ||
        !pObject->IsKindOf(RUNTIME_CLASS(ThreadData)))
    return 1;   

    // Do some processing.
    int x = 0; 
    while (x++ < 5000)
    {
        for (int i=0; i<50000; i++)
            double sum = sqrt((double)i+1) * sqrt((double)i+2); 
    }

    return 0;
}

Controlador de botones

void Cmsgwait_demoDlg::OnBnClickedBtnStartThread()
{
    m_pThreadData = new ThreadData;
    CWinThread* pWorkThread = AfxBeginThread(MyThreadProc, m_pThreadData);

    m_status.SetWindowText("Status: Waiting for thread to complete."); 

    HANDLE handles[] = { pWorkThread->m_hThread }; 
    DWORD ret = 0; 

    do 
    {
        ret = MsgWaitForMultipleObjects(1, handles, FALSE, INFINITE, QS_ALLINPUT); 
        if (ret == WAIT_OBJECT_0)
        {
            m_status.SetWindowText("Status: Thread completed."); 
        }
        else if (WAIT_IO_COMPLETION)
        {
            m_status.SetWindowText("Status: User mode APC queued."); 
        }
        else if (WAIT_FAILED)
        {
            m_status.SetWindowText("Status: Wait failed"); 
        }
    }
    while (ret != WAIT_OBJECT_0 && ret != WAIT_FAILED);
}

Respuestas a la pregunta(1)

Su respuesta a la pregunta