Grundlegendes zu MsgWaitForMultipleObjects

Ich habe einen Haupt-GUI-Thread, der auf Benutzeraktionen wie das Verschieben des Dialogfelds, das Ändern der Größe usw. reagieren soll, während ein Hintergrund-Thread eine Aufgabe ausführt. In der Vergangenheit habe ich WaitForSingleObject mit einer Zeitüberschreitung verwendet, um GUI-Ereignisse zu verarbeiten, während auf den Abschluss des Hintergrundthreads gewartet wurde. Ich habe kürzlich über MsgWaitForMultipleObjects gelesen, das das Problem zu lösen schien, dass ich ein bisschen sauberer hatte.

Kann mir jemand die Bugs im folgenden Code sagen und wo ich hier falsch liege? Die Benutzeroberfläche reagiert nicht, wenn ich auf die Schaltfläche klicke, um den Thread zu starten. Ich habe eine Dialog-App mit einer Avi erstellt, die auf dem Haupt-UI-Thread abgespielt wird. Ich habe eine Schaltfläche zum Starten eines Threads und verwende MsgWaitForMultipleObjects, um auf das Thread-Handle zu warten, aber zuzulassen, dass alle Nachrichten verarbeitet werden, die letztendlich unterbrochen werden, wenn der Thread beendet / signalisiert ist.

Vielen Dank.

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;
}

Button Handler

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);
}

Antworten auf die Frage(1)

Ihre Antwort auf die Frage