PYQT5子线程与主线程之间通讯问题小计

编程入门 行业动态 更新时间:2024-10-25 04:17:19

PYQT5子线程与主线程之间通讯问题<a href=https://www.elefans.com/category/jswz/34/1751282.html style=小计"/>

PYQT5子线程与主线程之间通讯问题小计

子线程与主线程通讯

1、问题描述

主要是想实现主界面中写sql代码,然后运行,由于代码可能运行时间过长,为了不影响主界面使用所以想将耗时较长的跑sql阶段交给子线程。

2、子线程代码

class run_oracle(QThread):_signal=pyqtSignal(object) ###定义一个信号变量def __init__(self):super(run_oracle, self).__init__()def accept(self,l:list): ###用于接受主界面传过来的代码self.code=l[0]self.con=l[1]def run(self): ####重写QThread类中的run方法data = pd.read_sql(self.code, self.con) ###利用pandas提取数据self._signal.emit([data,1]) ###将带有数据的信号发送,这里我返回的数据是一个列表格式,具体可以根据实际修改

这里有几个问题注意一下:
1、这个run方法是不能带参数,所以主界面发送过来的代码不能直接用run方法接收,这里定义了一个accept方法来接收主界面传过来的代码。
2、不要把执行sql代码的语句写在accept里面,如果写在里面的话,主界面依旧会卡到代码执行完成后才能用

3、由于整体代码较长这里只放主界面关于子线程处理的方法

    def thredrun(self):self.thr=run_oracle()try:self.thr.accept([self.code,self.con]) ###调用子线程参数接受方法self.thr.start()  ###启动子线程self.thr._signal.connect(self.onclick)  ####将子线程信号带过来的数据发送给onclick槽函数进行业务处理except:#print(code)QMessageBox(QMessageBox.Critical, '错误提示', '获取数据异常,请检查代码or数据库连接').exec_()

关于主线程和子线程互相通信的整个流程就是这样,说一下自己的体会吧:
这块内容我在网上搜索了两个晚上,得到的方法我都自己试了下不知道啥原因都没有成功,其中我觉得最应该成功的方法就是,在主界面也定义一个信号向子线程的槽函数发送数据,这个感觉没问题啊,但是就是没成功也是醉了,最后自己一点点试也算是试出来这样一种方式,那种离成功一步之遥却总是出问题的感觉真的难受!

更多推荐

PYQT5子线程与主线程之间通讯问题小计

本文发布于:2024-03-07 02:46:13,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1716629.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:小计   线程   主线   通讯

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!