zoukankan      html  css  js  c++  java
  • qt调用quit()后未结束线程解决方案

    正常操作

    正常写Qt的多线程,需要继承QThread,然后重写run函数,调用start后,在run函数中实现子线程的运行,这个时候会开启事件循环,可以调用quit()函数来结束当前的线程。

    其他操作

    根据qt的官方文档,可以通过连接槽的方式,然后利用Qt::DiretionConnection来实现多线程。大概如下所示:

    QThread proxyThread = new QThread();
    connect(proxyThread, &QThread::started, this, &TestThread::runEx, Qt::DirectConnection);
    connect(this, &TestThread::finished, proxyThread, &QThread::quit);
    

    在RunEx函数末,emit finished()信号,即可调用quit来“尝试”结束proxyThread线程。

    但是如果在主线程中调用proxyThread->isRunning()的死循环来判断当前线程是否结束,得到的结果始终都是true。

    如果贸然的使用delete来释放线程,会让程序崩溃。

    看到网上有很多说法,比如说调用isFinished来判断,但是isFinished一直都是false。

    换句话说,quit()根本就没有让proxyThread结束掉。

    在查阅各种资料后,发现在“主线程”调用terminate()可以主动的结束子线程。

    也就是

    emit finished();
    proxyThread->terminate();
    

    即可正确结束线程,调用delete也不会让程序崩溃了。

  • 相关阅读:
    解决Xcode 7编译错误:does not contain bitcode
    iOS无处不在详解iOS集成第三方登录(SSO授权登录无需密码)
    iOS- 如何集成支付宝
    99.Recover Binary Search Tree
    101.Symmetric Tree
    108.Convert Sorted Array to Binary Search Tree
    242.Valid Anagram
    292.Nim Game
    872.Leaf-Similar Trees
    HDU-1390 Binary Numbers
  • 原文地址:https://www.cnblogs.com/ligiggy/p/15219931.html
Copyright © 2011-2022 走看看