【问题标题】:PyQt Qthread automatic restartPyQt Qthread 自动重启
【发布时间】:2014-09-05 09:55:25
【问题描述】:

我试图了解线程是如何工作的,但我遇到了这个问题。这是我的程序解释: 我在 pyqt 中制作了一个简单的 GUI,它使用 QObject 作为工作类。当我按下按钮启动 gui 从列表中读取一个随机值并将其传递给线程,打印 接下来的五个数字。当线程完成工作时,它将数据传递给 gui。现在我希望 GUI 自动重新启动一个具有新起始值的新线程。我可以通过再次按开始重新启动线程,但我需要在没有人工交互的情况下启动它。在那里 有什么方法吗?

提前致谢

from PyQt4.QtCore import *
from PyQt4.QtGui import *
import time
import sys
import numpy as np



class SomeObject(QObject):

    finished = pyqtSignal(object)
    valore = pyqtSignal(object)
    vector = pyqtSignal(object)

    def __init():
        super(SomeObject, self).__init__()

    def longRunning(self):
        vec = []
        end = self.count + 5 
        while self.count < end:
            time.sleep(1)
            vec.append(self.count)
            self.valore.emit(self.count)
            self.count += 1
        self.finished.emit(vec)
        #self.vector.emit()

    def setCount(self, num):
        self.count = num

class GUI(QDialog):

    def __init__(self, parent = None):
        super(GUI, self).__init__(parent)
        #declare QThread object
        self.objThread = QThread()
        #declare SomeObject type, and move it to thread
        self.obj = SomeObject() 
        self.obj.moveToThread(self.objThread) 
        #connect finished signal to nextVector method
        self.obj.finished.connect(self.nextVector)
        #connect valore to self.prova method
        self.obj.valore.connect(self.prova)
        #self.obj.vector.connect(self.nextVector)
        #Connect thread.start to the method long running
        self.objThread.started.connect(self.obj.longRunning)

        botton = QPushButton("start")
        self.connect(botton, SIGNAL("clicked()"), self.showcount)
        box = QHBoxLayout()
        box.addWidget(botton)        
        self.setLayout(box)

        #a list of random number
        a = np.random.randint(10, size = 5)
        self.iter = iter(a)

    def showcount(self):
        """
        When botton clicked, read the next value from iter, pass it to
        setCount and when start the thread
        """        
        try:
            a = self.iter.next()
            print a
            self.obj.setCount(a)        
            self.objThread.start()
        except StopIteration:
            print "finito"
        #self.obj.setCount(a)        
        #self.objThread.start()
        #print self.objThread.currentThreadId()

    def prova(self, value):
        """
        Connected to signal valore, print the value
        """
        print value

    def nextVector(self, vec):
        """
        Print the whole vector
        """
        print vec
        self.objThread.quit()
        try:
            a = self.iter.next()
            print a
            self.obj.setCount(a)        
            self.objThread.start()
        except StopIteration:
            print "finito"

app = QApplication(sys.argv)
form = GUI()
form.show()
app.exec_()    

【问题讨论】:

    标签: python pyqt qthread qobject


    【解决方案1】:

    您已经设置好了。当您的线程完成时,它会发出调用 nextVector 方法的完成信号,因此只需在 nextVector 结束时调用 start 方法。

    def nextVector(self, vec):
        ...
        self.showcount()
    # end nextVector
    

    您可能还想为您的 QPushButton 更改为新的信号连接

    button.clicked.connect(self.showcount)
    

    【讨论】:

    • 我试过了,但是当线程发出完成信号时,程序调用 showcount 方法没有任何反应。我通过用 self.obj.finished.connect(self.objThread.quit) 和 self.objThread.finished.connect(self.nextVector) 替换 self.obj.finished.connect(self.nextVector) 找到了解决方案,但老实说我没有区别
    • 哦,好吧,我要补充的另一件事是,一个线程只能调用一次 run 方法,然后您应该调用 join 方法来释放该线程。如果你想多次运行它,你将不得不再次重新创建线程。抱歉,我以为您每次都在 showcount 方法中创建一个新线程。解决此问题的唯一其他方法是使用锁定的可暂停线程类。 stackoverflow.com/questions/8103847/…
    • 所以问题是我试图重用一个线程,而不是创建一个新线程,对吗?您发布的链接很有趣,但我更喜欢使用 QObject/Qthread 方法
    • 是的,一个线程只能使用一次。我更喜欢 python 线程,因为如果您尝试第二次启动线程,它会强制执行此操作并引发错误。 stackoverflow.com/questions/14293368/…
    猜你喜欢
    • 2011-12-13
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2021-10-25
    • 1970-01-01
    • 2015-09-08
    • 2014-03-25
    • 1970-01-01
    相关资源
    最近更新 更多