在Thread' run()方法中使用While条件

时间:2014-07-27 00:39:00

标签: python pyqt

我不确定while True:方法中指定的run()条件是否必要。 我已经使用和没有while条件执行了这段代码,它运行正常。 但我仍然想知道使用它的目的。任何想法为什么应该或不应该使用?

from PyQt4 import QtCore, QtGui
import Queue as queue

app = QtGui.QApplication([])
theQueue = queue.Queue()

class TheThread(QtCore.QThread):
    def __init__(self, theQueue, parent=None):
        QtCore.QThread.__init__(self, parent)
        self.theQueue = theQueue

    def run(self):
        while True:
            task = self.theQueue.get()
            self.sleep(1) 
            self.theQueue.task_done()

threads=[]
for i in range(1, 3): 
    thread = TheThread(theQueue)
    threads.append(thread)
    thread.start()

for i in range(len(threads)):
    theQueue.put(i)

1 个答案:

答案 0 :(得分:2)

while True循环意味着您的线程将继续(理论上)继续运行,阻止task = self.theQueue.get()调用。如果你使用的是threading.Thread个对象,这会使你的程序挂起而无法退出,因为Python线程只要它们正在运行就会使主线程保持活动状态,除非你将daemon属性设置为在启动线程之前为True。但是,因为您正在使用QThreads,程序将在线程仍在运行时退出。当你这样做时,你最终会收到警告:

QThread: Destroyed while thread is still running
QThread: Destroyed while thread is still running

我建议 not 使用while True循环,因为您的线程只是为了从主线程获取单个消息,并调用wait(类似于{ {1}})在退出主程序之前对每个线程对象进行操作,以确保它们在主线程退出之前完成:

threading.Thread.join

如果由于某种原因确实需要class TheThread(QtCore.QThread): def __init__(self, theQueue, parent=None): QtCore.QThread.__init__(self, parent) self.theQueue = theQueue def run(self): task = self.theQueue.get() self.sleep(1) print(task) self.theQueue.task_done() threads=[] for i in range(1, 3): thread = TheThread(theQueue) threads.append(thread) thread.start() for i in range(len(threads)): theQueue.put(i) for t in threads: t.wait() 循环,请使用sentinel向线程发出信号,告知它们应该退出:

while True