我有以下代码:
from PySide.QtCore import *
import time
class GUI(object):
IDLIST = [i for i in xrange(20)]
UNUSEDIDS = [i for i in xrange(20)]
def __init__(self):
print "GUI CLASS INITIALIZED!"
worker = Worker()
worker2 = Worker2()
threadpool = QThreadPool()
threadpool.setMaxThreadCount(10)
for i in xrange(5):
#Alternate between the two
#threadpool.start(worker)
#worker2.start()
@classmethod
def delegator(self):
"""Irrelevant to the question, I need this method for something else"""
USEDIDS = []
toUse = self.UNUSEDIDS[0]
USEDIDS.append(toUse)
self.UNUSEDIDS.pop(0)
return toUse
class Worker(QRunnable):
def __init__(self, parent=None):
super(Worker, self).__init__(parent)
def run(self):
#idInUse = getattr(GUI, "delegator")
idInUse = GUI.delegator()
print "Hello world from QRunnable", idInUse
#time.sleep(5)
class Worker2(QThread):
def __init__(self, parent=None):
super(Worker2, self).__init__(parent)
def run(self):
idInUse = GUI.delegator()
print "Hello world from QThread", idInUse
s = time.time()
GUI()
print "Done in %s" % ((time.time()-s) * 1000)
我认为从代码中可以明显看出预期的效果。我希望显示“来自 QThread/QRunnable 的 Hello world”。由于我正在编写一个多线程应用程序,因此在我的 GUI__init__
部分中,我有一个启动并发线程的循环。
问题是,使用 QRunnable 它工作得很好。我指定的所有 5 个线程同时执行。然而,对于 QThread,情况并非如此。相反,我收到以下错误:
QThread:在线程仍在运行时被销毁
它根本没有执行。
通常我完全不介意使用 QRunnable,但是,它不是从 QObject 派生的(所以我不能直接发出信号,尽管我可以QObject()
在其中构造一个),而且它也没有.stop()
我急需的方法。谷歌搜索显示没有办法阻止 QRunnable 执行?另一方面,QThread 具有我需要的这两种方法。
所以我想我的问题是如何让多个相同的 QThreads 同时运行,或者如何终止 QRunnable 的执行?
(也请记住,python 的内置线程模块是不可能的)