PySide - QThread运行但未进入连接到信号“started”的插槽

0 投票
1 回答
642 浏览
提问于 2025-04-18 17:55

我以为我对Qt中的线程已经了解得很透彻了,但显然我理解错了。我在这方面卡了很久,所以非常希望能得到大家的帮助。

我创建了一个类,在它的__init__方法里启动了一个线程:

class MyClass(object):
    def __init__(self):
        (...)

        self.thread = QtCore.QThread(parent)
        worker = Worker()
        QtCore.QObject.connect(self.thread, QtCore.SIGNAL('started()'), worker,
                QtCore.SLOT('doWork()'))
        QtCore.QObject.connect(worker, QtCore.SIGNAL('finished()'), self.thread,
                QtCore.SLOT('quit()'))
        QtCore.QObject.connect(worker, QtCore.SIGNAL('finished()'), worker,
                QtCore.SLOT('deleteLater()'))
        QtCore.QObject.connect(self.thread, QtCore.SIGNAL('finished()'),
                self.thread, QtCore.SLOT('deleteLater()'))
        worker.moveToThread(self.thread)
        self.thread.start()

这个Worker类看起来是这样的:

class Worker(QtCore.QObject):
    (some signals)

    def doWork(self):
        print "doing my work"

问题是我的doWork槽(也就是处理工作的地方)从来没有被执行,尽管线程是正在运行的。

在创建MyClass的实例后,比如说:

obj = MyClass()

我可以调用:

obj.thread.isRunning()

这会返回True,说明线程确实在运行。

我猜测是因为线程创建的方法很快就结束了,所以没有发出'started'信号(当我在启动线程后加上睡眠时间,doWork槽就会被执行)。我想知道这种情况应该怎么正确处理。

如果我没有清楚地解释我的问题,请告诉我。非常感谢大家的提前帮助。

1 个回答

5

你的工作线程在 MyClass 的构造函数返回后被垃圾回收了。把 worker 变成 MyClass 的一个成员,这样它就能在构造函数结束后继续存在。

self.worker = Worker()

撰写回答