class CMRThread
{
public:
CMRThread(DWORD stackSize);
virtual ~CMRThread(void);
public:
BOOL FreeOnTerminate;
void Run();
bool IsRunning(){ return m_bRunning; }
HANDLE GetThreadHandle(){ return m_hThread; };
DWORD GetThreadId(){ return m_dwThreadId; };
protected:
virtual void Excute()=NULL;
public:
void MRThreadCallback();
private:
HANDLE m_hThread;
DWORD m_dwThreadId;
bool m_bRunning;
};
DWORD WINAPI DataTransThreadExcute(LPVOID lpParma)
{
CMRThread* thread = (CMRThread*)lpParma;
thread->MRThreadCallback();
return 0;
}
CMRThread::CMRThread(DWORD stackSize):
FreeOnTerminate(false),
m_bRunning(false)
{
m_hThread = CreateThread(NULL, stackSize, DataTransThreadExcute, (LPVOID)this, CREATE_SUSPENDED, &m_dwThreadId);
}
CMRThread::~CMRThread(void)
{
CloseHandle(m_hThread);
}
void CMRThread::MRThreadCallback()
{
this->Excute();
if (FreeOnTerminate)
{
delete this;
}
}
void CMRThread::Run()
{
if (!m_bRunning)
{
ResumeThread(m_hThread);
m_bRunning = true;
}
}