1

我正在尝试使用 Anaconda python 在 MacOS X 上运行我在这里找到的这个简单示例。

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
4

3 回答 3

1

您的程序将立即退出,因为您在启动线程后没有给它任何操作。您看到的错误是因为线程很惊讶主线程没有它就退出了。

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

于 2014-03-22T00:36:21.753 回答
0

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_()
于 2014-03-21T19:59:45.817 回答
-1

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

  1. 线程 #1 - 创建新线程,#2
  2. 创建线程#2
  3. 线程#1 重新获得控制权并运行。
  4. 线程 #1 死亡或thread变量被 GC(垃圾收集器)清理 - 我假设第二种情况不应该发生

为了解决这个问题,不要让主线程死掉。在它死之前,清理所有线程。

http://pyqt.sourceforge.net/Docs/PyQt4/qthread.html#wait

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

阻塞线程,直到满足以下任一条件:

  • 与此 QThread 对象关联的线程已完成执行(即,当它从 run() 返回时)。如果线程已完成,此函数将返回 true。如果线程尚未启动,它也会返回 true。
  • time 毫秒已经过去。如果时间为 ULONG_MAX(默认值),则等待永远不会超时(线程必须从 run() 返回)。如果等待超时,此函数将返回 false。

这提供了与 POSIX pthread_join() 函数类似的功能。

因此,添加thread.wait()到您的代码中。

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

于 2014-03-21T19:13:25.110 回答