Qt跨线程发送信号与元数据

Qt的signals/slots支持跨线程通信,但当传递自定义类型参数时,若在非主线程创建临时对象,可能导致槽函数接收到析构后的对象。通过qRegisterMetaType注册元数据,Qt能安全处理这种情况,可能通过内部复制对象来确保安全。连接类型如Qt::AutoConnection、Qt::DirectConnection和Qt::QueuedConnection决定了信号与槽的执行时机。删除复制构造函数会导致Qt无法复制对象,从而影响跨线程通信。
摘要由CSDN通过智能技术生成

        转载请注明出处:http://blog.csdn.net/luotuo44/article/details/39395025



        Qt的signals/slots是可以用在线程间的。由于事件循环(event loop)是在主线程完成的,所以在非主线程发送一个信号时,对应的槽函数将会由主线程执行。



        熟悉多线程的读者应该都感受到这里会有一个微妙的问题。如果signals/slots的函数参数是一个自己定义的类型。比如自己定义了一个Student类,信号函数为sendStudent(const Student &stu); 对应的槽函数为:getStudent(const Student &stu); 如果在非主线程使用emit发射信号的时候,Student参数是一个临时变量的话(即可能马上被析构掉),那么主线程在执行这个槽函数的时候这个临时变量可能被析构了。这就相当于使用了野指针。

 

        Qt的作者肯定也想到了这一点。

        我们回过头来深入了解connect函数,因为是它把信号和槽连起来的。在connect函数中,我们一般都只使用4个参数。实际上它是有5个参数的,只是使用了默认参数而已。第5个参数是一个枚举类型Qt::ConnectionType,有下面5种:

  • Qt::AutoConnection: 如果发射信号的线程和执行槽函数的线程是在同一个线程,此时等同于Qt::DirectConn
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值