zoukankan      html  css  js  c++  java
  • QThread安全的结束线程

    博客地址已更改,文章数量较多不便批量修改,若想访问源文请到 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/

    在上文中提到了一个简单范例:

    1. #include <QCoreApplication>
    2. #include <QThread>
    3. #include <QDebug>
    4. class MyThread : public QThread {
    5. protected:
    6. void run() {
    7. while(1) {
    8. qDebug()<<"thread start:"<<QThread::currentThreadId();
    9. msleep(500);
    10. }
    11. }
    12. };
    13. int main(int argc, char *argv[]) {
    14. QCoreApplication a(argc, argv);
    15. qDebug()<<"Main:"<<QThread::currentThreadId();
    16. MyThread m;
    17. m.start();
    18. QThread::sleep(5);
    19. m.terminate();
    20. m.wait();
    21. return 0;
    22. }

    此范例使用terminate强制关闭线程,此行为是很危险的,下面提供一种安全的关闭方式

    1. #include <QCoreApplication>
    2. #include <QThread>
    3. #include <QDebug>
    4. class MyThread : public QThread {
    5. public:
    6. void stop() { //用于结束线程
    7. is_runnable =false;
    8. }
    9. protected:
    10. void run() {
    11. while(is_runnable) {
    12. qDebug()<<"thread start:"<<QThread::currentThreadId();
    13. msleep(500);
    14. }
    15. is_runnable = true;
    16. }
    17. private:
    18. bool is_runnable = true; //是否可以运行
    19. };
    20. int main(int argc, char *argv[]) {
    21. QCoreApplication a(argc, argv);
    22. qDebug()<<"Main:"<<QThread::currentThreadId();
    23. MyThread m;
    24. m.start();
    25. QThread::sleep(5);
    26. m.stop();
    27. m.wait();
    28. return 0;
    29. }

    通过对while循环增加bool类型作为判断实现安全的结束线程,当is_runnable=false时,程序会完成此次循环后结束,所以要wait等待,不可直接关闭程序。

  • 相关阅读:
    (转)Java new一个对象的过程中发生了什么
    多线程面试题集锦
    java调用ffmpeg获取视频文件信息的一些参数
    单点登录系统SSO实现
    Docker 项目上线
    Docker
    Docker
    Docker
    Docker
    Docker
  • 原文地址:https://www.cnblogs.com/techiel/p/8018366.html
Copyright © 2011-2022 走看看