关于跨线程操作的心得
来源:互联网 发布:pr文艺小清新调色数据 编辑:程序博客网 时间:2024/06/11 08:14
背景:创建线程是为了把任务量大的事情交给线程去做,防止因为主线程(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 0
- 关于跨线程操作的心得
- 关于线程的心得
- 关于线程的一点心得
- 关于线程同步的一点心得
- 关于java线程方面的心得
- 关于.net 下ftp操作的心得
- 关于 操作符“<<”和“>>”重载的心得
- 关于线程操作的waitpid()
- 关于异步线程BackgroundWorker类的使用心得
- 关于C#跨线程操作和Pinvoke的一些总结
- 关于hibernate对视图的操作的一点心得
- 关于强制退出线程操作的代码
- 关于线程间的控件互操作
- 关于DEVExpress的使用心得,有关打印操作!
- 关于抛出跨线程操作UI线程的异常的处理
- 关于创作的心得
- 关于软件设计的心得
- 关于管理的心得
- 命令行 降低IE版本 IE11降到IE8
- service工作过程
- 传统基础图片压缩:先尺寸压缩后质量压缩
- Objective-c 中保留小数点后几位
- Mybatis映射pojo包含pojo
- 关于跨线程操作的心得
- mysql:distinct与group by 效率对比
- HibernateTemplate和HibernateDaoSupport的认识
- yii 框架下载文件
- (SG函数)Fibonacci again and again--HDOJ
- Mac下 eclipse 自动添加import
- Android开发 之 图像滤镜GPUImage框架
- hibernate和mybatis区别
- Hadoop on Docker