使用moveToThread在PyQt5中启动QThreads。一个线程无法正常启动

时间:2015-07-13 05:37:31

标签: python multithreading pyqt qthread pyqt5

我的(半)工作示例中有4个工作线程。我只能使前三个工作线程工作。如何才能运行第4个线程?

print(QThread.idealThreadCount())在我的笔记本电脑上返回'8'。

我可以重新排序代码,使3名工人的任意组合运行。

from PyQt5.QtCore import QThread, QObject
from PyQt5.QtWidgets import QWidget
import sys
from PyQt5.QtWidgets import QApplication
import time

class A(QObject):
    def run(self):
        while 1:
            print('A', time.ctime())
            time.sleep(1)
class B(QObject):
    def run(self):
        while 1:
            print('B', time.ctime())
            time.sleep(1)
class C(QObject):
    def run(self):
        while 1:
            print('C', time.ctime())
            time.sleep(1)
class D(QObject):
    def run(self):
        while 1:
            print('D', time.ctime())
            time.sleep(1)

class window1(QWidget):
    def __init__ (self, parent = None):
        super().__init__ () #parent widget
        print(QThread.idealThreadCount())

        self.thread1 = QThread()
        obj1 = A()
        obj1.moveToThread(self.thread1)
        self.thread1.started.connect(obj1.run)
        self.thread1.start()

        self.thread2 = QThread()
        obj2 = B()
        obj2.moveToThread(self.thread2)
        self.thread2.started.connect(obj2.run) 
        self.thread2.start()

        self.thread3 = QThread()
        obj3 = C()
        obj3.moveToThread(self.thread3)
        self.thread3.started.connect(obj3.run)
        self.thread3.start()

        self.thread4 = QThread()
        obj4 = D()
        obj4.moveToThread(self.thread4)
        self.thread4.started.connect(obj4.run)
        self.thread4.start()

app = QApplication(sys.argv) 
w = window1()
w.show()
sys.exit(app.exec_())

2 个答案:

答案 0 :(得分:4)

您没有存储对srcobj1等的引用。因为它们没有父级(需要使用obj2),所以它们在结束时被垃圾收集。 moveToThread方法。您添加的__init__只会延迟time.sleep(1)方法和垃圾回收的结束。

如果存储对象的引用(例如__init__),则所有线程都应该正确运行。

答案 1 :(得分:0)

我想出如果我在time.sleep(1)方法的顶端添加__init__延迟,所有线程现在都可以工作....

我想理解为什么。一个更好的答案将不胜感激。

from PyQt5.QtCore import QThread, QObject
from PyQt5.QtWidgets import QWidget, QApplication
import sys
import time

class A(QObject):
    def run(self):
        while 1:
            print('A', time.ctime())
            time.sleep(1)
class B(QObject):
    def run(self):
        while 1:
            print('B', time.ctime())
            time.sleep(1)
class C(QObject):
    def run(self):
        while 1:
            print('C', time.ctime())
            time.sleep(1)
class D(QObject):
    def run(self):
        while 1:
            print('D', time.ctime())
            time.sleep(1)

class window1(QWidget):
    def __init__ (self, parent = None):
        super().__init__ () #parent widget

        self.thread1 = QThread()
        obj1 = A()
        obj1.moveToThread(self.thread1)
        self.thread1.started.connect(obj1.run)
        self.thread1.start()

        self.thread2 = QThread()
        obj2 = B()
        obj2.moveToThread(self.thread2)
        self.thread2.started.connect(obj2.run) #this sets up a signal in the other direction??
        self.thread2.start()

        self.thread3 = QThread()
        obj3 = C()
        obj3.moveToThread(self.thread3)
        self.thread3.started.connect(obj3.run) #this sets up a signal in the other direction??
        self.thread3.start()

        self.thread4 = QThread()
        obj4 = D()
        obj4.moveToThread(self.thread4)
        self.thread4.started.connect(obj4.run)
        self.thread4.start()

        time.sleep(1)

app = QApplication(sys.argv) #every pyqt application must create an application object
w = window1()
w.show()
sys.exit(app.exec_())