boost线程中断

/**
模拟功能:线程中断  boost::this_thread::interruption_point()
一个对话框应用程序,界面上有两个按钮,一个是“开始”一个是“退出”,点击“开始”时创建一个线程,
这个线程会执行一个任务,whatever,可能是下载一个大文件吧,然后在下载过程中需要在窗口上实时刷新当前进度。
而在下载过程中“退出”按钮随时可能被点击,这时要求要先退出线程,再退出应用程序。
*/

#include "stdafx.h"
#include <windows.h>
#include <boost/thread.hpp>
#include <boost/bind.hpp>

using namespace std;
using std::tr1::shared_ptr;
class Downloader
{
public:
	Downloader() : m_percent(0) {}
	void start()
	{
		m_thread.reset(new boost::thread(boost::bind(&Downloader::download, this)));
		//m_thread->detach();此处不要detach 否则线程不可控 无法中断
	}
	void stop()
	{
		m_thread->interrupt();
	}
	int get_percent() { return m_percent; }
private:
	void download()
	{
		try
		{
			while (m_percent < 100)
			{
				// 这是个中断点
				boost::this_thread::interruption_point();
				++m_percent; // 模拟下载过程,加到100算结束
				// 这里也是中断点
				boost::this_thread::sleep(boost::posix_time::seconds(1));
				cout << "Percent is " << m_percent << endl;
			}
		}
		catch (boost::thread_interrupted& /*e*/)
		{
			//捕获中断点抛出异常
			// 加上try-catch
			cout << "thread interrupted " << endl;
		}
	}
	shared_ptr<boost::thread> m_thread; // 下载进程
	int m_percent; // 下载百分比
};


int _tmain(int argc, _TCHAR* argv[])
{
	cout << "要开始下载文件吗?" << endl;
	char ch;
	if (cin >> ch && ch == 'y')
	{
		Downloader d;
		d.start();
		cout << "已经开始下载" << endl;
		cout << "要停止吗?" << endl;
		if (cin >> ch && ch == 'y')
		{
			d.stop();
		}
		cout << "已经下载了%" << d.get_percent() << endl;
		Sleep(10000);
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值