QThread中的默认run()实现为您运行一个事件循环,等效于:
class GenericThread(QThread): def run(self, *args): self.exec_()
事件循环的重要之处在于,它允许线程 拥有的 对象在其插槽上接收事件,这些事件将 在该线程中
执行。这些对象只是QObject,而不是QThreads。
重要说明:QThread对象 不属于其自己的线程 !它是在主线程上创建的,并在那里存在。除了其run方法之外,所有代码都在主线程中执行。
因此,您应该可以执行以下操作:
class GenericWorker(QObject): def __init__(self, function, *args, **kwargs): super(GenericWorker, self).__init__() self.function = function self.args = args self.kwargs = kwargs self.start.connect(self.run) start = pyqtSignal(str) @pyqtSlot def run(self, some_string_arg): self.function(*self.args, **self.kwargs)my_thread = QThread()my_thread.start()# This causes my_worker.run() to eventually execute in my_thread:my_worker = GenericWorker(...)my_worker.moveToThread(my_thread)my_worker.start.emit("hello")另外,请仔细考虑
self.function当前已丢弃的结果的结果。您可以在上声明另一个信号
GenericWorker,该信号接收结果,并让
run()方法在完成后发出该信号,并将结果传递给它。
一旦掌握了这些要点,并意识到您不应该也不应该继承QThread,生活就会变得更加简单明了。简而言之,永远不要在QThread中工作。您几乎应该永远不需要覆盖运行。对于大多数使用情况,设置与QObject到QThread的适当关联并使用QT的信号/插槽为进行多线程编程提供了一种非常强大的方法。请注意不要让推送到工作线程的QObject徘徊…
http://ilearnstuff.blogspot.co.uk/2012/09/qthread-best-practices-when-
qthread.html



