信号绑定使用了BlockingQueuedConnection参数后正确退出线程的方式

BlockingQueuedConnection

官方文档解释:

        Same as Qt::QueuedConnection, except that the signalling thread blocks until the slot returns. This connection must not be used if the receiver lives in the signalling thread, or else the application will deadlock.        

        与Qt::QueuedConnection相同,只是信号线程会阻塞,直到插槽返回。如果接收器位于信号线程中,则不得使用此连接,否则应用程序将死锁。

我的对该参数在用作主线程和子线程间交互的理解:

        场景:子线程有一个信号,在主线程中将这个信号和主线程的槽绑定使用BlockingQueuedConnection参数

        它的逻辑是当线程当中信号发送后执行连接的槽函数,该槽函数是在槽所在线程执行不会移交给发送者线程,而且需要当槽函数执行完成后才会再运行线程run函数,阻塞点就在线程发送信号的位置.这样的逻辑方式能很好的实现线程的同步操作.

        在使用过程中,当子线程需要结束释放子放线程资源时就会发现使用wait();函数将阻塞主线程造成死锁,这是因为子线程中信号发送后主线程的槽并未结束而被阻塞在了wait();函数这里导致死锁的情况(包括使用while(Thread->isRunning());等).若不等待子线程而直接释放子线程资源很可能程序意外崩溃

        正确的释放逻辑是断开子线程和主线程的信号与槽连接(disconnect();)再等待线程退出然后才释放资源

        还有一种更安全稳定的办法就是创建一个子类该子类去实现所需的槽函数,在程序结束时先释放子类再去做等待最后释放资源

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值