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.csdn.net/detail/fishjam/4199009

你可能感兴趣的:(FTL(Fishjam,Template,Library),Thread)