对象所属线程

对象所属线程

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

 

posted on 2022-11-14 11:47  邗影  阅读(118)  评论(0编辑  收藏  举报

导航