Python mac上pyqtgraph中的QThread已损坏

Python mac上pyqtgraph中的QThread已损坏,python,qt,qthread,pyqtgraph,Python,Qt,Qthread,Pyqtgraph,我试图在MacOS X上用Anaconda python运行我发现的这个简单示例 import pyqtgraph as pg import time plt = pg.plot() def update(data): plt.plot(data, clear=True) class Thread(pg.QtCore.QThread): newData = pg.QtCore.Signal(object) def run(self): while T

我试图在MacOS X上用Anaconda python运行我发现的这个简单示例

import pyqtgraph as pg
import time

plt = pg.plot()

def update(data):
    plt.plot(data, clear=True)

class Thread(pg.QtCore.QThread):
    newData = pg.QtCore.Signal(object)
    def run(self):
        while True:
            data = pg.np.random.normal(size=100)
            # do NOT plot data from here!
            self.newData.emit(data)
            time.sleep(0.05)

thread = Thread()
thread.newData.connect(update)
thread.start()
然而,我不断得到:

QThread: Destroyed while thread is still running

调用
QThread.start()
时,该函数立即返回。发生的事情是

  • 线程#1-创建新线程#2
  • 线程#2已创建
  • 线程#1恢复控制并运行
  • 线程#1死亡或
    线程
    变量被GC(垃圾收集器)清除-我假设第二种情况不应该发生
  • 要解决这个问题,不要让主线死。在它死之前,清理所有的线

    bool QThread.wait(self,int msecs=ULONG_MAX)

    阻塞螺纹,直到满足以下任一条件:

    • 与此QThread对象关联的线程已完成执行(即从run()返回时)。此函数将返回 如果线程已完成,则为true。如果线程 尚未启动
    • 时间已过毫秒。如果time是ULONG_MAX(默认值),那么等待将永远不会超时(线程必须从run()返回)。 如果等待超时,此函数将返回false
    这提供了与POSIX pthread_join()类似的功能 功能

    因此,在代码中添加
    thread.wait()


    注意:您需要确保线程退出。照原样,它永远不会退出。

    pyqtgraph.plot方法对我来说似乎有问题(无论如何,我无法让它产生任何有用的输出,但可能我做错了什么)

    但是,如果我创建一个
    PlotWidget
    并“手动”设置应用程序,它将按预期工作:

    import pyqtgraph as pg
    import numpy as np
    import time
    
    app = pg.QtGui.QApplication([])
    window = pg.QtGui.QMainWindow()
    plot = pg.PlotWidget()
    window.setCentralWidget(plot)
    window.show()
    
    def update(data):
        plot.plot(data, clear=True)
    
    class Thread(pg.QtCore.QThread):
        newData = pg.QtCore.Signal(object)
        def run(self):
            while True:
                data = pg.np.random.normal(size=100)
                # do NOT plot data from here!
                self.newData.emit(data)
                time.sleep(0.05)
    
    thread = Thread()
    thread.newData.connect(update)
    thread.start()
    
    app.exec_()
    

    您的程序正在立即退出,因为在它启动线程后,您没有给它任何操作。您看到的错误是因为线程对主线程在没有它的情况下退出感到惊讶


    解决方案:在脚本末尾添加
    QtGui.QApplication.exec()。或者,如果您有PyQt(而不是PySide),您可以从交互式python提示符运行。

    他没有事件循环,关键是,您在退出之前加入线程。即使主事件循环退出,您也必须加入您的线程,否则您就要冒着他所问的风险来理解您的观点。但是:如果启动了事件循环,那么似乎没有必要等待线程。我不太清楚为什么,因为线程在事件循环退出后继续运行..存在一个争用条件,即线程启动但其线程存储未初始化-这就是导致Qt发出错误消息的原因。然而,在离开主执行之前不等待线程完成可能会在其他地方导致问题。在我的回答中,我假设任何使用Qt的人都已经知道QCoreApplication::exec()之类的事情。这只出现在每个代码示例中:)ekhumoro:请在另一个SO问题或pyqtgraph邮件列表中与pg.plot()分享您的经验。@Luke。我现在无法重现以前的问题,所以我一定是做错了什么。没有关系。。。