基础技术一: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方法。


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MFC中,你可以使用C++11标准库中提供的线程安全队列std::queue和std::deque,需要在项目属性中开启“使用C++11标准”选项。 定义一个线程安全队列可以使用如下代码: ```cpp #include <queue> #include <mutex> template <typename T> class ThreadSafeQueue { public: ThreadSafeQueue() {} void push(const T& value) { std::lock_guard<std::mutex> lock(mutex_); queue_.push(value); } bool empty() const { std::lock_guard<std::mutex> lock(mutex_); return queue_.empty(); } bool try_pop(T& value) { std::lock_guard<std::mutex> lock(mutex_); if (queue_.empty()) { return false; } value = std::move(queue_.front()); queue_.pop(); return true; } private: mutable std::mutex mutex_; std::queue<T> queue_; }; ``` 这里使用了模板类ThreadSafeQueue来封装了一个线程安全的队列,其中mutex_是一个互斥锁,queue_是一个std::queue类型的队列。push函数用来向队列中添加元素,empty函数用来判断队列是否为空,try_pop函数用来从队列中取出元素,如果队列为空则返回false。 在使用时,你可以创建一个ThreadSafeQueue对象来存储数据,例如: ```cpp ThreadSafeQueue<int> queue; queue.push(1); queue.push(2); int value; if (queue.try_pop(value)) { // 处理取出的value } ``` 需要注意的是,std::queue和std::deque的线程安全版本std::queue<std::mutex>只是提供了基本的线程安全保障,如果需要更高级的线程安全操作,可以考虑使用其他的线程安全数据结构,例如boost::lockfree::queue。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值