基础技术一:MFC 线程对象封装

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方法。


猜你喜欢

转载自blog.csdn.net/mrlzl9/article/details/78962022