boost线程中断

    xiaoxiao2021-04-17  37

    /** 模拟功能:线程中断 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; }
    转载请注明原文地址: https://ju.6miu.com/read-673831.html

    最新回复(0)