《QEventLoop 的使用两例》补充

正好查QEventLoop用法,找到《QEventLoop 的使用两例》,网址:

http://blog.csdn.net/dbzhang800/article/details/6300519

其中第一种用法,是用QEventLoop来使主线程的某段代码延迟一定时间执行,而避免sleep()函数中断主线程造成界面不响应的缺点

但是有一点疑惑,就是QEventLoop::exec()虽然开启了一个局部的事件循环,但是这个函数本身不会立即返回,而要等事件循环结束后才能返回

也就是说只有这个“局部事件循环”结束之后,后续代码才能得到运行

从这点意义上来说,当QEventLoop::exec()没有返回时,主线程实际上是被它占用的,从而主线程中的主事件循环也是失效的,而这会直接导致界面不响应

这就和那篇文章描述的有出入。


事实如何呢。做了个小程序实验,内容就不贴出来了,很简单的。实验结果,证明我的推断是错的,在QEventLoop::exec()没返回时,界面仍然能正常响应


原因在哪呢?


首先,可以肯定的是,QEventLoop::exec()创立的局部事件循环实实在在地打断了主事件循环,这一点是确信无疑的。

因为一个线程中,在同一时间只可能存在一个循环。如果存在2个循环,那它就不是一个线程了


但界面为什么能响应无误呢?


我推测,界面产生的事件,譬如鼠标、键盘等事件,被派送到了QEventLoop::exec()创立的局部事件循环队列中去

也就是局部事件循环暂时代替主事件循环处理事件,才能保证事件的正常处理。相应地,Q必t有机制,用来检测某个线程中生效的事件循环是哪一个。这种机制是不难实现的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值