永发信息网

python线程间通信的问题,回答有加分!300

答案:2  悬赏:60  手机版
解决时间 2021-03-25 13:10
python线程间通信的问题,回答有加分!300
最佳答案
pyqt的线程之间的通信是通过信号to槽来实现的,首先你在线程类里面声明一个全局槽比如:

class imThread(QtCore.QThread):
    imslot = QtCore.pyqtSignal()这里是要重点注意,上面的是没有任何参数的一个信号,如果你需要参数的话,你可以在里面添加参数类型,例如:
imslot1 = QtCore.pyqtSignal(str)    #这是一个带字符串参数的信号
imslot2 = QtCore.pyqtSignal(int)    #这是一个带整型参数的信号
imslot3 = QtCore.pyqtSignal(bool)   #这是一个带布尔参数的信号当然了,如果你需要多个参数的话,同样地往里面加就是了,qt也没有要求参数必须是同类型的,所以可以这样:
imslot1 = QtCore.pyqtSignal(str, int)    #这是一个带整型和字符串的参数信号
imslot2 = QtCore.pyqtSignal(int, str, str)    #这是一个带整型和两个字符串的参数信号
imslot3 = QtCore.pyqtSignal(bool, str) #这是一个带布尔和字符串的参数信号在线程的run方法里面来定义执行信号:

self.imslot.emit()这里也是需要重点注意的是,上面这个接口是没有参数的,如果你是要参数的话,是需要这样写:
self.imslot1[str].emit('hello')
self.imslot2[int].emit(1)
self.imslot3[bool].emit(False)多参数的是这样
self.imslot1[str, int].emit('hello', 1)
self.imslot2[int, str, str].emit(1, "hello", "world")
self.imslot3[bool, str].emit(False, 'hello')以上就是在线程类里面完成信号定义了,接下来就是逻辑层成定义一个函数槽来连接线程类里面的信号,这个也很简单,比如我在主线程类里面定义一个方法:
def imSlot():
    print 'ok'以上这个是槽函数,接下来是实现信号槽的连接
imThread.imslot.connect('imSlot')这个就是信号槽的连接方式,当然了,这个是没有参数的一个信号槽,那么带参数的怎么写呢?也很简单!首先定义一个槽函数:
def imSlot(para):
    print para这个是带参数的槽函数,下面是:
imThread.imslot[str].connect('imSlot')以上就是线程之间的方法了,子线程在执行的通行经过执行信号的话,子线程可以安全地执行而不会出现GUI主线程卡死的情况了。
追问我用的是pyside,里面没有QtCore.pyqtSignal()这个方法,但是大意理解了,可是我再用QtCore.Signal()构造的时候一直提示AttributeError: 'PySide.QtCore.Signal' object has no attribute 'connect',没有这个方法。
全部回答
Qt只允许主线程使用界面类,因为界面类不是线程安全的,不可重入,在多个线程中使用可能会出现问题,因此Qt不建议主界面线程外的线程使用图形类和调用图形类接口。建议你修改最初的设计,让界面与控制分离,主线程主要做界面显示,工作线程使用signal-slot控制主线程中的界面类,从而间接达到控制目的。追问对于pyside来说有什么实现多线程调用吗?
thread_1.testSignal.connect(x)
不管如何都会提示没有testSignal没有connect方法追答
首先你要先定义一个信号才行self.testSignal= QtCore.pyqtSignal()
要在你的窗体中定义一个响应这个信号的槽def handle_testSignal(self):
    .....

然后连接这个信号和槽self.testSignal.connect(self.handle_testSignal)
最后在你希望进行跨线程调用的地方发出这个信号self.testSignal.emit()

没有你完整的原码,只能给个大至思路。
如果你闲signal-slot的方法麻烦可以用Queue,在工作线程中放入数据,在界面中加个定时器,定时取出数据并把数据在界面显示出来。
追问我没有用QtCore.pyqtSignal(),用的是PySide.QtCore.Signal()这个方法没有connect...或者是我定义的方法不对?
class my_thread(threading.Thread):
testSignal = QtCore.Signal()追答PySide编译时间太长,现在没有PySide环境的,晚上回家看看。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我就想知道大泼猴什么时候上映了,这都马上
凉皮汤怎么熬?
求小农民的爽歪歪生活的txt下载
红砖做基行吗?
营口车站派出所地址在什么地方,我要处理点事
2018年468分可以读哪些大学
在大学食堂卖什么比较赚钱
十个人三班倒双休怎么排????
下列含数学的成语分别与哪个历史人物有关?
心里纠结怎么办?
3d彩票和值为14的号码有哪些
说人“刁”和说他“挑”,有什么区别??
频率大于________赫兹的声波叫做超声波.频率
我已经登陆了【手机Q】靓号,但是呢,却没有
隐藏式行车记录仪迈瑞威和迈卡盾哪个好些,本
推荐资讯
苏H是哪里车?
什么纯木底板好
送呈 台启 谨订于 年 公历 月 日 (星期 )
我很爱一个人,我们是异地。
单选题镓是1871年俄国化学家门捷列夫在编制元
幽字的扩词有什么
我一直好奇。男生如果看见自己喜欢的女生的素
傅作义手下有没有一个山东济宁籍的朱姓军官?
以自己的热情,专注在领域里边做到极致,给别
陈胜简介,陈胜吴广起义,陈胜是一个怎样的人
被别人冤枉了怎么办。 我和邻居隔着一间房间
有没有一个星球的公转周期是130天的?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?