template class CDebugDialog : public CDialogImpl { protected: CDebugger * m_Debugger; HANDLE m_CreatedEvent; HANDLE m_DialogThread; static DWORD CreateDebuggerWindow (CDebugDialog * pThis) { pThis->DoModal(NULL); pThis->WindowCreated(); return 0; } void WindowCreated ( void ) { SetEvent(m_CreatedEvent); } public: CDebugDialog (CDebugger * debugger) : m_Debugger(debugger), m_CreatedEvent(CreateEvent(NULL,true,false,NULL)), m_DialogThread(NULL) { } virtual ~CDebugDialog (void) { HideWindow(); CloseHandle(m_CreatedEvent); if (m_DialogThread) { CloseHandle(m_DialogThread); m_DialogThread = NULL; } } void HideWindow ( void ) { if (m_hWnd && ::IsWindow(m_hWnd)) { ::EndDialog(m_hWnd, 0); } if (m_DialogThread) { if (WaitForSingleObject(m_DialogThread, 5000) == WAIT_TIMEOUT) { WriteTrace(TraceError,"CDebugDialog - time out on close"); TerminateThread(m_DialogThread, 1); } CloseHandle(m_DialogThread); m_DialogThread = NULL; } } void ShowWindow ( void ) { if (m_hWnd) { SetForegroundWindow((HWND)m_hWnd); } else { DWORD ThreadID; ResetEvent(m_CreatedEvent); m_DialogThread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)CreateDebuggerWindow,(LPVOID)this,0, &ThreadID); if (WaitForSingleObject(m_CreatedEvent,20000) == WAIT_TIMEOUT) { WriteTrace(TraceError,"Failed to get window create notification"); } } } };