1

我有以下代码:

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 的内置线程模块是不可能的)

4

1 回答 1

0

发生-exceptionQThread: Destroyed while thread is still running是因为您从不等待线程完成,并且您没有保留对它们的任何引用(无论是worker还是worker2threadpool所以当您__init__完成时它会被破坏。

如果您保留对此对象的引用,则应该可以:

def __init__(self):
    print "GUI CLASS INITIALIZED!"

    self.worker = Worker()
    self.worker2 = Worker2()

    self.threadpool = QThreadPool()
    self.threadpool.setMaxThreadCount(10)

    for i in xrange(5):
        #Alternate between the two
        self.threadpool.start(worker)
        # this is wrong, by the way!
        # you should create 5 workers, not call start 5 times...
        self.worker2.start()

并且在线程/池上调用wait/waitForDone方法会更好。
因为当它的(C++)析构函数被调用时,QThreadPool这隐含地发生了。如果不是这种情况,那么您的程序首先不会与s 一起使用 eiter。对于这样的事情没有发生,甚至提到它可能会导致崩溃。所以最好明确地等待线程完成......QRunnableQThread

另外,我希望你已经知道

于 2012-05-16T12:41:38.543 回答