正好查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有机制,用来检测某个线程中生效的事件循环是哪一个。这种机制是不难实现的。