关于跨线程操作的心得

背景:创建线程是为了把任务量大的事情交给线程去做,防止因为主线程(GUI线程)执行逻辑代码产生卡顿造成用户体验不好的现象。

这样子就会涉及主线程和子线程的通信问题。

子线程包括了逻辑子线程和GUI子线程,一般来说因为GUI子线程有自己的触发事件,跟主线程交互的情况比较少,所以就不讨论了,这里就单单说下逻辑子线程。

一般子线程要传递数据或者调用主线程的函数,都会使用信号SIGNAL。
在子线程对象被创造出来的时候

    m_SMU = new SMUThread();    //子线程对象被创建
    connect(m_SMU,SIGNAL(sendString(QString)),this,SLOT(Auxiliary_information(QString)));//信号槽绑定子线程,捕捉sendString事件,来触发Auxiliary_information()函数

然后再

emit sendString(str);   //子线程中发射信号

这就是子线程对主线程的交互。

那么好了,主线程该如何跟子线程进行交互呢?例如我想点击主线程来触发子线程发送数据。

一开始我是直接用子线程对象来调用子线程函数

m_SMU->SendRecv(0,buf,sizeof(buf),0);//主线程直接调用m_SMU线程下的SendRecv函数

然后bingo,功能实现出来了,然后把上述代码放入botton点击事件中去,想调用几次就点击几次,然后就报错了。。

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

大概意思是不能够跨线程调用。。

然后我就在想,当初是通过信号来触发主线程函数,反过来可不可以呢?

当然可以,但是你要知道怎么写。

主线程里面创建对象时

m_SMU = new SMUThread(this); //把主线程的指针传进去

子线程的逻辑里面写一个connect

this->connect(parent,SIGNAL(sendString(QString)),this,SLOT(test()));//parent 是 主线程指针,用于监听主线程的信号 来触发test()函数。

然后系统又报错了。。。
QObject::moveToThread: Cannot move objects with a parent

意思是说,调用moveToThread必须要

m_SMU = new SMUThread();  //不能传入任何东西  指针必须要为0

难道主线程调用子线程真就这么难?

还有一个办法,在主线程里写一个connect

connect(ui->pushButton_4,SIGNAL(clicked(bool)),m_SMU,SLOT(test()));//获取botton点击事件来调用子线程的函数

本人刚学QT不久,如果有好的线程交互希望能留言给个方向或者关键字,谢谢大家了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值