/**
模拟功能:线程中断 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;
}
boost线程中断
最新推荐文章于 2022-11-04 22:49:17 发布