博客地址已更改,文章数量较多不便批量修改,若想访问源文请到 coologic博客 查阅,网址:www.coologic.cn
如本文记录地址为 techieliang.com/A/B/C/ 请改为 www.coologic.cn/A/B/C/ 即可查阅
版权声明:若无来源注明,Techie亮博客文章均为原创。 转载请以链接形式标明本文标题和地址:本文标题:QThread安全的结束线程 本文地址:http://techieliang.com/2017/12/599/
1. QThread使用
基本使用请见:http://techieliang.com/2017/12/592/
在上文中提到了一个简单范例:
- #include <QCoreApplication>
- #include <QThread>
- #include <QDebug>
- class MyThread : public QThread {
- protected:
- void run() {
- while(1) {
- qDebug()<<"thread start:"<<QThread::currentThreadId();
- msleep(500);
- }
- }
- };
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- qDebug()<<"Main:"<<QThread::currentThreadId();
- MyThread m;
- m.start();
- QThread::sleep(5);
- m.terminate();
- m.wait();
- return 0;
- }
此范例使用terminate强制关闭线程,此行为是很危险的,下面提供一种安全的关闭方式
- #include <QCoreApplication>
- #include <QThread>
- #include <QDebug>
- class MyThread : public QThread {
- public:
- void stop() { //用于结束线程
- is_runnable =false;
- }
- protected:
- void run() {
- while(is_runnable) {
- qDebug()<<"thread start:"<<QThread::currentThreadId();
- msleep(500);
- }
- is_runnable = true;
- }
- private:
- bool is_runnable = true; //是否可以运行
- };
- int main(int argc, char *argv[]) {
- QCoreApplication a(argc, argv);
- qDebug()<<"Main:"<<QThread::currentThreadId();
- MyThread m;
- m.start();
- QThread::sleep(5);
- m.stop();
- m.wait();
- return 0;
- }
通过对while循环增加bool类型作为判断实现安全的结束线程,当is_runnable=false时,程序会完成此次循环后结束,所以要wait等待,不可直接关闭程序。