Python mac上pyqtgraph中的QThread已损坏
我试图在MacOS X上用Anaconda python运行我发现的这个简单示例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
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()
时,该函数立即返回。发生的事情是
线程
变量被GC(垃圾收集器)清除-我假设第二种情况不应该发生- 与此QThread对象关联的线程已完成执行(即从run()返回时)。此函数将返回 如果线程已完成,则为true。如果线程 尚未启动
- 时间已过毫秒。如果time是ULONG_MAX(默认值),那么等待将永远不会超时(线程必须从run()返回)。 如果等待超时,此函数将返回false
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。我现在无法重现以前的问题,所以我一定是做错了什么。没有关系。。。