对象所属线程
QT中的信号槽与c++中的回调很像,又和通知很像,代码行至某处,发送信号emit,然后槽函数接收到信号;
但是QT也支持跨线程执行,就是A对象给B对象发送信号,B不会立即执行信号,而是等待B所属线程(创建B的时候在哪个线程,对象就属于哪个线程)有空闲,然后执行槽函数;
1 信号槽的使用涉及继承QObject;MOC文件的生成,涉及到元对象编译器重新编译信号槽函数;
2 在Qt4中槽函数必须要进行显示声明,否则人家不认,在Qt5中不需要额外的声明
Qt::AutoConnection(默认) 根据 sender 和 receiver 两者所在线程,当信号发出时作出判断。同一线程则 Qt::DirectConnection 连接,否则使用 Qt::QueuedConnection 连接。
容易产生误区的点:不是sender的所属线程,而是真正触发了emit 信号的动作线程。 Qt::DirectConnection 无论sender和receiver是否在统一线程,都会立刻调用槽函数,最简单的理解成把一段代码“临时插入”到了运行栈,所以在多线程情况下非常危险,必须做好线程同步。 Qt::QueuedConnection sender的信号会被压入到接收者的事件循环中,所以不会立即调用。而是等到当接收者对象处理其自身的消息队列时,再针对消息队列中的这个信号进行处理。
可以说就是为了开发者解决跨线程通信而设计的。当然你也可以用于同一个线程不同对象,这种相同线程的强行指定队列方式通常都会和GUI的模态窗有关(后面会举例分析)。 Qt::BlockingQueuedConnection 这个真的是看名字就知道干了啥,Blocking+QueuedConnection,这就说明他的槽函数运行时机与QueuedConnection是一致的。那Blocking的意义是什么?
就是阻塞发送者!直到槽函数运行完毕再继续执行。源码上相比QueuedConnection的实现多加了一个等待输入的信号量QSemaphore,所以一旦接收者和发送者在同一线程,那势必就会产生死锁。 Qt::UniqueConnection 这个其实严格上来说相比上面四种方式并不算新的连接方式,而是用于修饰上面的四种连接方式。他实现的效果就是避免重复连接,因为Qt的信号槽是可以同一个信号和槽函数重复多次连接。
这种通常都会是只执行一次就好,那就通过这个标志位进行修饰,达到多次连接(实际上也只是连接了一次)也只调用一次槽函数的效果。用(Qt::ConnectionType|Qt::UniqueConnection)来修饰。 ———————————————— 原文链接:https://blog.csdn.net/u013052326/article/details/122272460
原文地址:http://www.cnblogs.com/8335IT/p/16878716.html
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,请务用于商业用途!
3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员!
8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载
声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性