boost线程中断

来源:互联网 发布:mac其他文件怎么清理 编辑:程序博客网 时间:2024/06/03 17:06
/**模拟功能:线程中断  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-catchcout << "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;}

0 0
原创粉丝点击