project64/Source/Project64/N64 System/Debugger/Debug Dialog.h

77 lines
1.5 KiB
C
Raw Normal View History

template <class T>
class CDebugDialog :
public CDialogImpl<T>
{
protected:
CDebugger * m_Debugger;
HANDLE m_CreatedEvent;
HANDLE m_DialogThread;
static DWORD CreateDebuggerWindow (CDebugDialog<T> * 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");
}
}
}
2015-01-31 19:27:27 +00:00
};