Esempio n. 1
0
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);
				}
			}
		}
	}
}