Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/351.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt4信号未触发连接方法_Python_Multithreading_Signals_Pyqt4 - Fatal编程技术网

Python PyQt4信号未触发连接方法

Python PyQt4信号未触发连接方法,python,multithreading,signals,pyqt4,Python,Multithreading,Signals,Pyqt4,我决定使用信号来指示线程的完成。我将信号连接到代码,如果还有更多工作,代码将重新启动该过程。唉,与信号相连的代码永远不会触发。这让我很难过 我需要知道为什么下面代码块中的“Tester”方法没有启动 我是python新手,所以当我开始写这篇文章时,我研究了信号,并根据发布的解决方案对代码进行了建模,显然我错过了一些重要的东西,但我真的看不到它是什么 下面是我的代码的一个大规模简化版本: from PyQt4.QtCore import * import time class Worker(QT

我决定使用信号来指示线程的完成。我将信号连接到代码,如果还有更多工作,代码将重新启动该过程。唉,与信号相连的代码永远不会触发。这让我很难过

我需要知道为什么下面代码块中的“Tester”方法没有启动

我是python新手,所以当我开始写这篇文章时,我研究了信号,并根据发布的解决方案对代码进行了建模,显然我错过了一些重要的东西,但我真的看不到它是什么

下面是我的代码的一个大规模简化版本:

from PyQt4.QtCore import *
import time

class Worker(QThread):
    __pyqtSignals__ = ( "a", 
                        "b" )
    def __init__(self):
        QThread.__init__(self, None)


    def run(self):
        print "'Worker.run' starts"
        self.emit(SIGNAL("a"))
        print "'Worker.run' ends"


class Main:
    def Do(self):
        print "'Do' starts"
        self.Launch()
        time.sleep(2)
        print "'Do' ends"


    def Launch(self):
        print "'Launch' starts"
        self.worker = Worker()
        QObject.connect(self.worker, SIGNAL("a"), self.Tester)
        self.worker.daemon = True
        self.worker.start()
        print "'Launch' ends"


    def Tester(self):
        print "Tester Fired!!"

m=Main()
运行:

>>> m.Do()
收益率:

'Do' starts
'Launch' starts
'Launch' ends
'Do' ends
'Worker.run' starts
'Worker.run' ends
但不是预期的:

Tester Fired!!

我错过了什么?此外,为什么即使使用
睡眠(2)

也会在“Worker.run”中的打印内容出现在其他内容之后?如果您希望看到调用回调,则必须更改连接方式 将QThread信号发送到插槽:

 QtCore.QObject.connect(self.worker,
                        Qt.SIGNAL("a"),
                        self.Tester,
                        Qt.Qt.DirectConnection) #this is added
说明: 自Qt 4以来,Qt信号/插槽是线程安全的。文件表明,当 将信号连接到插槽是“自动连接”,这意味着它是直接的(回调是 如果信号和插槽都在同一线程中,则在发出后立即激发,而 如果信号是从另一个线程(您的案例)发出的,则排队

然后,必须处理这个队列:通常,这是在应用程序运行时由Qt循环完成的

信号“排队”这一事实意味着控制权被转移到Qt循环,以使 确保在主线程中调用回调,即使信号来自另一个线程 线

在您的问题代码中,根本没有事件循环-因此,获得 从另一个线程调用的插槽用于更改发送信号的方式。不要使用 但是,在您的代码中,因为在正常的应用程序中,Qt循环正在运行,
它将被正确地调度(并且不会出现线程问题)

如果你想看到你的回调被调用,你必须改变你的连接方式 将QThread信号发送到插槽:

 QtCore.QObject.connect(self.worker,
                        Qt.SIGNAL("a"),
                        self.Tester,
                        Qt.Qt.DirectConnection) #this is added
说明: 自Qt 4以来,Qt信号/插槽是线程安全的。文件表明,当 将信号连接到插槽是“自动连接”,这意味着它是直接的(回调是 如果信号和插槽都在同一线程中,则在发出后立即激发,而 如果信号是从另一个线程(您的案例)发出的,则排队

然后,必须处理这个队列:通常,这是在应用程序运行时由Qt循环完成的

信号“排队”这一事实意味着控制权被转移到Qt循环,以使 确保在主线程中调用回调,即使信号来自另一个线程 线

在您的问题代码中,根本没有事件循环-因此,获得 从另一个线程调用的插槽用于更改发送信号的方式。不要使用 但是,在您的代码中,因为在正常的应用程序中,Qt循环正在运行,
它将被正确地调度(并且不会出现线程问题)

请注意,您可以使用:
self.worker.a.connect(self.Tester)
,而不是使用
QObject.connect(…)
。这有很多优点:它更容易阅读,更短,更安全,因为如果
a
信号不存在,将引发错误,而使用另一种方法,连接将以静默方式失败。这一点很好!我将定义重构,以实现新样式的s&s,一旦我得到这个版本的功能。谢谢请注意,您可以使用:
self.worker.a.connect(self.Tester)
,而不是使用
QObject.connect(…)
。这有很多优点:它更容易阅读,更短,更安全,因为如果
a
信号不存在,将引发错误,而使用另一种方法,连接将以静默方式失败。这一点很好!我将定义重构,以实现新样式的s&s,一旦我得到这个版本的功能。谢谢谢谢你的回复!是的,我现在看到我的实现存在根本性的缺陷(没有QT循环,叹气)。我希望在Python、PySide和PyGame中投入足够的实践和学习时间,以达到专业程序员对机制的理解水平。然后我就可以帮助别人并创建好的代码。我发现关于这类内容的python信息分为两类:非常基本的示例,或者假设对基本框架有深入了解的高级用户文档。因此,我正努力从中间立场走下去,直到我在这个问题上获得了“临界量”的知识。再次感谢!谢谢你的回复!是的,我现在看到我的实现存在根本性的缺陷(没有QT循环,叹气)。我希望在Python、PySide和PyGame中投入足够的实践和学习时间,以达到专业程序员对机制的理解水平。然后我就可以帮助别人并创建好的代码。我发现关于这类内容的python信息分为两类:非常基本的示例,或者假设对基本框架有深入了解的高级用户文档。因此,我正努力从中间立场走下去,直到我在这个问题上获得了“临界量”的知识。再次感谢!