我其实是想在线程函数fsmf中发一个信号,在shishi函数中收到这个信号,怎么办?

从线程发信号,在线程外面收信号,不会用。

img


我其实是想在线程函数fsmf中发一个信号,在shishi函数中收到这个信号,怎么办?

你这代码写的是真乱。给你写了个例子,根据下面的例子修改即可:


import sys

from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication


# 线程类
class QTSignal(QtCore.QThread):
    sendmsg = pyqtSignal(int)

    def __init__(self):
        super(QTSignal,self).__init__()
        self.g1g1=1

    # 线程函数,这里写你的逻辑
    def run(self):
        for i in range(10):
            self.g1g1 = i # 这里根据你的需要调整g1g1的值,我这里直接遍历了i
            self.sendmsg.emit(self.g1g1)

# 信号处理类,这里绑定信号和槽函数,在槽函数中处理
class shili(QMainWindow): # 这里集成QMainWindow类是为了显示窗口

    def __init__(self):
        super(shili,self).__init__()
        self.send = QTSignal()
        self.send.sendmsg.connect(self.shishi)

    def fsmf(self):
        self.send.start() # 启动线程,进行处理

    def shishi(self,val):
        print(val) # 槽函数,val是线程发送的数据

# 测试
if __name__ == '__main__':
    app = QApplication(sys.argv)
    form = shili()
    form.fsmf()
    form.show()
    sys.exit(app.exec_())

【以下回答由 GPT 生成】

在问题描述中,您提到了希望在Python的线程函数fsmf中发送一个信号,并在shishi函数中接收该信号。以下是一个可能的解决方案。

首先,为了实现信号的发送和接收,您可以使用PyQt5库提供的信号和槽机制。您可以定义一个QObject子类来作为信号的发送方,并在该类中定义一个pyqtSignal。然后,您可以在线程函数中调用该信号来发送信号。

在接收方函数中,您可以将一个QObject子类的实例作为信号的接收方,并使用connect函数将信号与槽函数进行连接。这样,当信号发出时,槽函数将自动被调用。

下面是修改后的示例代码:

from PyQt5.QtCore import QObject, pyqtSignal
import threading

class MySignal(QObject):
    sendmsg = pyqtSignal(int)

    def __init__(self):
        super(MySignal, self).__init__()

    def run(self):
        self.sendmsg.emit(10)

class MySlot(QObject):
    def __init__(self):
        super(MySlot, self).__init__()

    def get(self, msg1):
        return msg1

class MyClass(QObject):
    g1g1 = 0

    def __init__(self):
        super(MyClass, self).__init__()
        self.send = MySignal()
        self.slot = MySlot()
        self.send.sendmsg.connect(self.slot.get)

    def fsmf(self):
        global g1g1
        for i in range(10):
            if i == 5:
                g1g1 = 0
        self.send.run()

    def shishi(self):
        global g1g1
        t = threading.Thread(target=self.fsmf)
        t.setDaemon(True)
        t.start()
        g1g1 = self.slot.get()

# 创建MyClass的实例
obj = MyClass()
# 调用shishi函数
obj.shishi()

在这个示例代码中,MySignal类定义了一个sendmsg信号,并在MySignalrun函数中调用sendmsg信号来发送信号。

MySlot类定义了一个get槽函数,用于接收信号。在MyClass的构造函数中,我们创建了一个MySignal实例(send)和一个MySlot实例(slot),并使用connect函数将sendmsg信号与get槽函数连接起来。

fsmf函数中,我们在循环中通过修改全局变量g1g1的值来模拟发送信号的条件。然后,我们调用send实例的run函数来发送信号。

shishi函数中,我们创建一个线程并启动线程,然后等待线程结束后,我们获取slot实例的值,即接收到的信号。

这样,您就可以在fsmf线程函数中发送信号,并在shishi函数中接收到该信号了。

请注意,在多线程编程中,全局变量的修改需要进行同步处理,以避免竞态条件等问题。这里的示例代码仅仅是提供一个基本的思路,您可以根据实际情况进行进一步的优化和处理。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632