2013-05-06 58 views
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的

回答

0

添加这只是EXEC(前_TEST())修复该问题,但所有线程运行:

def waitForThreads(): 
    print "Waiting for thread pool" 
    pool.waitForDone() 
app.aboutToQuit.connect(waitForThreads)