0
我想使用Qt的QThreadPool,但是如果队列中的工作人员在调用QApplication.quit()之前没有完成,它似乎挂起我的应用程序。任何人都可以告诉我,如果我在下面缩小的测试用例中做错了什么?PySide QtCore.QThreadPool和QApplication.quit()会导致挂起?
import logging
log = logging.getLogger(__name__)
import sys
from PySide import QtCore
import time
class SomeWork(QtCore.QRunnable):
def __init__(self, sleepTime=1):
super(SomeWork, self).__init__()
self.sleepTime = sleepTime
def run(self):
time.sleep(self.sleepTime)
print "work", QtCore.QThread.currentThreadId()
def _test(argv):
logging.basicConfig(level=logging.NOTSET)
app = QtCore.QCoreApplication(argv)
pool = QtCore.QThreadPool.globalInstance()
TASK_COUNT = int(argv[1]) if len(argv) > 1 else 1
mainThread = QtCore.QThread.currentThreadId()
print "Main thread: %s"%(mainThread)
print "Max thread count: %s"%(pool.maxThreadCount())
print "Work count: %s"%(TASK_COUNT)
for i in range(TASK_COUNT):
pool.start(SomeWork(1))
def boom():
print "boom(); calling app.quit()"
app.quit()
QtCore.QTimer.singleShot(2000, boom)
#import signal
#signal.signal(signal.SIGINT, signal.SIG_DFL)
return app.exec_()
if __name__ == '__main__':
sys.exit(_test(sys.argv))
需要明确的是,这是输出I得到:
(env)[email protected]:# python test_pool.py 1
Main thread: 3074382624
Max thread count: 1
Work count: 1
work 3061717872
boom(); calling app.quit()
(env)[email protected]:/home/workshop/workshop/workshop# python test_pool.py 20
Main thread: 3074513696
Max thread count: 1
Work count: 20
work 3060783984
boom(); calling app.quit()
而且它永远挂在第二个命令,但不是第一个。
感谢您的任何帮助。
编辑:
- 要清楚,我预计,如果app.quit(),而线是在线程队列中被调用时,它们不运行。已经运行的线程应该运行完成。然后,应用程序应该关闭。
- 这个例子在Windows机器上失败,那么
- 此示例适用相同的Windows机器上,但使用PyQt4的