#if !defined(AFX_THREAD_H__67621B15_8724_4B5D_9343_7667075C89F2__INCLUDED_)
#define AFX_THREAD_H__67621B15_8724_4B5D_9343_7667075C89F2__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CThread
{
public:
CThread();
protected:
virtual ~CThread();
public:
DWORD m_dwThreadId;
HANDLE m_hThread;
BOOL Create(int nPriority = THREAD_PRIORITY_NORMAL, DWORD dwCreateFlags = 0);
DWORD SuspendThread();
DWORD ResumeThread();
BOOL PostThreadMessage( UINT message , WPARAM wParam, LPARAM lParam );
BOOL SetPriority(int nPriority);
protected:
virtual int OnThreadMessage(UINT Msg, WPARAM wParam, LPARAM lParam);
virtual BOOL InitInstance();
virtual DWORD ExitInstance();
DWORD Run();
static DWORD WINAPI ThreadProc(LPVOID lpParameter);
HANDLE m_hEventStarted;
bool m_started;
};
#endif // !defined(AFX_THREAD_H__67621B15_8724_4B5D_9343_7667075C89F2__INCLUDED_)
CThread::CThread()
{
m_hThread = 0
m_dwThreadId = NULL
m_hEventStarted = CreateEvent(0, FALSE, FALSE, NULL)
m_started = false
}
CThread::~CThread()
{
CloseHandle(m_hEventStarted)
CloseHandle(m_hThread)
}
BOOL CThread::Create(int nPriority /*=THREAD_PRIORITY_NORMAL*/, DWORD dwCreateFlags /*=0*/)
{
m_hThread=CreateThread(0, 0, ThreadProc, this, dwCreateFlags, &m_dwThreadId)
if (!m_hThread)
{
delete this
return FALSE
}
::SetThreadPriority(m_hThread, nPriority)
return TRUE
}
BOOL CThread::PostThreadMessage(UINT message, WPARAM wParam, LPARAM lParam)
{
BOOL res=::PostThreadMessage(m_dwThreadId, message, wParam, lParam)
ASSERT(res)
return res
}
DWORD CThread::ResumeThread()
{
DWORD res=::ResumeThread(m_hThread)
if (!m_started)
{
WaitForSingleObject(m_hEventStarted, INFINITE)
}
return res
}
DWORD CThread::SuspendThread()
{
return ::SuspendThread(m_hThread)
}
DWORD WINAPI CThread::ThreadProc(LPVOID lpParameter)
{
return ((CThread *)lpParameter)->Run()
}
DWORD CThread::Run()
{
InitInstance()
SetEvent(m_hEventStarted)
m_started = true
MSG msg
while (GetMessage(&msg, 0, 0, 0))
{
TranslateMessage(&msg)
if (!msg.hwnd)
OnThreadMessage(msg.message, msg.wParam, msg.lParam)
DispatchMessage(&msg)
}
DWORD res=ExitInstance()
delete this
return res
}
int CThread::OnThreadMessage(UINT Msg, WPARAM wParam, LPARAM lParam)
{
return 0
}
BOOL CThread::InitInstance()
{
return TRUE
}
DWORD CThread::ExitInstance()
{
return 0
}
BOOL CThread::SetPriority(int nPriority)
{
if (!m_hThread)
return false
return ::SetThreadPriority(m_hThread, nPriority)
}