class CThreadObj
{
public:
CThreadObj();
virtual ~CThreadObj();
/**
*@brief 启动线程接口
*/
void StartThread();
/**
*@brief 退出线程接口
*@author LuZhiLong[2017.05.11]
*/
void ExitThread();
/**
*@return 当前线程的句柄
*/
HANDLE GetThreadHandle();
protected:
/**
*@brief 函数ExitThread()调用标志。 TRUE:标志着线程已经退出
*/
bool m_bRun;
/**
*@brief 创建当前线程的线程ID
*/
unsigned int m_IThreadID;
/**
*@brief 函数ExitThread()强制退出terminate线程的等待时
*/
int m_iTerminateTime;
/**
*@brief 创建当前线程的线程句柄
*/
HANDLE m_hThread;
private:
/**
*@brief 静态函数,线程入口函数
*@param _pt 类型CThreadObj 指针,该指针具有虚函数特性
*/
static unsigned int WINAPI ThreadFunc(void *_pt);
/**
*@brief 线程运行执行的接口函数 \n
*@return void
*@attention 派生类重写该函数接口。
*/
virtual void Run() = 0;
/**
*@attention 对象不支持以下操作:拷贝赋值、赋值。
*/
CThreadObj & operator = (const CThreadObj &rhs);
CThreadObj(const CThreadObj &);
};
#include <process.h>
#include <winbase.h>
CThreadObj::CThreadObj()
: m_bRun(false)
, m_IThreadID(0)
, m_iTerminateTime(200)
, m_hThread(nullptr)
{
}
CThreadObj::~CThreadObj()
{
ExitThread();
}
HANDLE CThreadObj::GetThreadHandle()
{
return m_hThread;
}
void CThreadObj::StartThread()
{
if (m_bRun)
{
return;
}
m_bRun = true;
m_hThread = (HANDLE)_beginthreadex(nullptr, 0, &CThreadObj::ThreadFunc, this, 0,&m_IThreadID);
}
unsigned int CThreadObj::ThreadFunc(void *_pt)
{
CThreadObj *pThreadMini = (CThreadObj *) _pt;
if (nullptr == pThreadMini)
{
return 0;
}
pThreadMini->Run();
_endthreadex(0); //线程主动退出
return 0;
}
void CThreadObj::ExitThread()
{
if (!m_bRun)
{
return;
}
if (nullptr == m_hThread)
{
return;
}
DWORD retVal = WaitForSingleObject(m_hThread, m_iTerminateTime);
if (WAIT_TIMEOUT ==retVal)
{
TerminateThread(m_hThread, 0);
}
CloseHandle(m_hThread);
m_bRun = false;
m_hThread = nullptr;
m_IThreadID = 0;
}
子线程对象派生线程对象重写Run 方法。即可创建线程执行子线程的Run方法。