C++实现的可以安全的暂停、继续、停止线程的封装类

在使用线程时,最麻烦的就是线程的同步控制,如暂停、继续、停止(包括暂停状态下)等。虽然微软提供了 SuspendThread、TerminateThread 等函数“似乎”可以完成这个功能,但如果你在代码里使用这些函数,则往往会遇到各种问题(比如SuspendThread时正好在CRT分配内存的锁中造成其他线程也跟着锁死,TerminateThread时资源未释放)等。

本人经过试验和总结,整理出可以安全的进行暂停、继续、停止线程执行的一个线程类,能非常方便的对线程进行控制。

使用起来非常方便,只需从 FTL::CFThread 继承出一个子类,实现 Run 方法即可。要“安全高效”的提供控制功能,也非常简单,只需实现如下所示的代码框架即可:

DWORD CMyThreadDemo::Run()
{
	//线程初始化
	//进行线程的实际处理循环(比如压缩文件),每隔一小段时间调用一次 GetThreadWaitType
	//  此处以 SleepAndCheckStop 函数来模拟线程处理逻辑,也演示了替代系统提供的 Sleep 函数的方式
	while (FTL::ftwtTimeOut == SleepAndCheckStop(100))
	{
		::PostMessage(m_hWndParent, WM_THREAD_UPDATE_PROGRESS, 0, 0);
		//每隔循环周期内调用 GetThreadWaitType 来判断用户是否暂停或停止了
		//  (如果用户暂停了线程执行,将会阻塞在这个函数内部,直到用户继续或停止线程)
		if (FTL::ftwtContinue != GetThreadWaitType(INFINITE))
		{
			//如果到了这个地方,在使用 INFINITE 参数时只有一种情况:即调用了 Stop 函数停止了线程
			//因此可以进行线程退出前的处理(比如释放资源等)
			//PS: 从设计上来说,还有可能返回 ftwtError, 但从来没有出现过
			break;
		}
	}
	return 0;
}

详细的封装类和Sample程序参见下载地址:http://download.youkuaiyun.com/detail/fishjam/4199009

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值