Verständnis MsgWaitForMultipleObjects
Ich habe ein Haupt-gui-thread, ich will bleiben, in Reaktion auf die Benutzer-Aktion, wie das verschieben der dialog rund, Größe ändern, etc, während ich einen hintergrund-thread zu tun, manche Aufgabe. In der Vergangenheit habe ich verwendet WaitForSingleObject mit einem timeout, um den gui-Ereignissen während der Wartezeit auf den hintergrund-thread zu vervollständigen. Vor kurzem Las ich über die MsgWaitForMultipleObjects-sah die Lösung des Problems, ich hätte ein wenig sauberer.
Kann mir jemand sagen der Fehler im folgenden code & wo ich bin läuft hier falsch? Die gui reagiert nicht mehr wenn ich auf die Schaltfläche zum starten des Threads. Ich machte eine dialog-app mit einer avi Abspielen auf der Haupt-ui-thread. Ich habe eine Schaltfläche zum starten einen thread, und verwenden Sie MsgWaitForMultipleObjects warten auf das thread-handle, erlauben aber alle Nachrichten durch, um verarbeitet werden, die letztlich zu durchbrechen, wenn der thread beendet ist/signalisiert.
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;
}
Ereignishandler Der Schaltfläche
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);
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sie sind nicht mit der Verarbeitung der eingehenden Nachricht von der UI-thread, in Blick auf Raymond ' s blog (siehe auch hier) für eine Probe.