DWORD WINAPI StatusWindow::ThreadProc(LPVOID lpParameter) { HANDLE eventList[1]; StatusWindow *me = (StatusWindow *)lpParameter; bool waitingForClose = false; eventList[0] = me->eventCommandSent; me->dialog = CreateDialogParam(hInstance, MAKEINTRESOURCE(IDD_STATUSWINDOW), NULL, StatusWindow::MainDialogProc, (LPARAM)me); MSG msg; while(1) { DWORD rv; rv = MsgWaitForMultipleObjects(1, eventList, FALSE, INFINITE, QS_ALLEVENTS); if((rv >= WAIT_OBJECT_0) && (rv < WAIT_OBJECT_0 + 1)) { if(rv == WAIT_OBJECT_0) { switch(me->command->type) { case StatusCommand::COMMAND_CLOSE: // csThreadAlive is going to be entered already by the other thread DestroyWindow(me->dialog); // Pump the remaining messages while(GetMessage(&msg, NULL, 0, 0) > 0); SetEvent(me->eventCommandAcknowledged); return(TRUE); case StatusCommand::COMMAND_LOGMESSAGE: int length; length = GetWindowTextLength(GetDlgItem(me->dialog, IDC_LOG)); SendDlgItemMessage(me->dialog, IDC_LOG, EM_SETSEL, length, length); SendDlgItemMessage(me->dialog, IDC_LOG, EM_REPLACESEL, 0, (LPARAM)(TCHAR *)(static_cast<CommandLogMessage *>(me->command))->message); SendDlgItemMessage(me->dialog, IDC_LOG, WM_VSCROLL, SB_BOTTOM, (LPARAM)NULL); SetEvent(me->eventCommandAcknowledged); break; case StatusCommand::COMMAND_WAITFORCLOSE: waitingForClose = true; break; default: SetEvent(me->eventCommandAcknowledged); break; } } } else if(rv == WAIT_OBJECT_0 + 1) { while(PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) != 0) { if(msg.message == WM_QUIT) { if(waitingForClose) { me->threadAlive = false; SetEvent(me->eventCommandAcknowledged); } else { // Flushes the messages and sets threadAlive to false me->CleanupThread(); } return(TRUE); } if(!IsDialogMessage(me->dialog, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } } } }