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_()

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

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值