Multithreading 当调用isRunning时,QThread会挂起

Multithreading 当调用isRunning时,QThread会挂起,multithreading,qt,qt4,qthread,Multithreading,Qt,Qt4,Qthread,我有一个从web获取数据的QThread。有时,用户会要求其他内容,并且还需要获取更改后的数据 在当前配置中,我在线程上调用terminate(),更改输入数据,然后在线程上再次调用start()。现在,这很好,但有时在对终止的线程调用isRunning()或isFinished()时,主eventloop会被卡住。它会永远被卡住,直到我停止进程后才会恢复 为什么首先要挂起isRunning()或isFinished()?他们不想阻止 这个工作流程可以接受吗?如果不需要,当我不再需要线程时,如何

我有一个从web获取数据的
QThread
。有时,用户会要求其他内容,并且还需要获取更改后的数据

在当前配置中,我在线程上调用
terminate()
,更改输入数据,然后在线程上再次调用
start()
。现在,这很好,但有时在对终止的线程调用
isRunning()
isFinished()
时,主eventloop会被卡住。它会永远被卡住,直到我停止进程后才会恢复

  • 为什么首先要挂起
    isRunning()
    isFinished()
    ?他们不想阻止
  • 这个工作流程可以接受吗?如果不需要,当我不再需要线程时,如何停止线程的进程(或者如何放弃它)
  • 不要使用
    terminate()
    ,请阅读中的警告


    虽然可以重新启动
    QThread
    ,但重新启动线程通常不是一个好主意,应该有更好的解决方案来执行您尝试执行的操作。

    在某些情况下,线程在终止后变得不可用,
    isRunning()
    isFinished()
    可能会挂起调用线程,即使仅在
    终止后调用
    信号


    我的解决方法是终止一个线程,忘掉它,然后启动一个新的线程。

    我的线程没有任何互斥锁。它从web获取数据,并通过信号将其发送到主线程。随时杀死它是可以的,它不需要清理任何东西。另外,杀死线程并不会破坏
    isRunning()
    的行为。那么QThread本身持有的互斥锁呢?我敢打赌,
    isRunning
    是挂起的,但很难说,我无法复制它。