首页| 论坛| 消息

回复: 事件循环是什么?
#6 [onlyone 08-16 16:03]
与windows 程序设计里面的事件循环是类似的概念。
虽然我没有看过qt源码,但是如果你用sdk开发过windows程序,需要自己写一个windows的事件循环机制。进入事件循环后,实际上是在等待用户的操作。
比如用户点击退出,会触发windows退出事件的操作。
点击按钮,会触发按钮点击事件等等。

QT中每个线程都有自己的事件循环。
所以“主线程循环是否就是响应主线程及其子线程所有的事件,这样理解对吗?” 这个是不完全对的。
主线程响应自己的事件。
子线程也有自己的事件循环。
垮线程发信号消息,就是把发送的线程,把消息丢到对方线程的消息队列上去。接收线程的事件循环会从自己的消息队列上取消息,进而去执行。
如果线程阻塞,那么无法进入事件循环,也就无法响应一切事件。如果主线程被阻塞,给人感觉就是界面卡死不响应。
如果你有过windows sdk 编程,有些地方知识都是类似的,虽然不全部完全相同。
#7 回 笑颜 的帖子 [介农酥 08-17 09:29]
笑颜:在这里如果我们只考虑Qt的事件循环,那么可以继续描述。
事件循环相当于是一个阻塞的操作,所以不管在哪个线程里面启动起来就没办法再执行后面的指令。
Qt的事件循环就是用QEventLoop来做的,如果你在事件循环里面再嵌套一个事件循环,肯定也是不能再执行后面的指令,但是你嵌套 .. (2019-08-16 15:54) 
#8 回 onlyone 的帖子 [介农酥 08-17 09:29]
onlyone:与windows 程序设计里面的事件循环是类似的概念。
虽然我没有看过qt源码,但是如果你用sdk开发过windows程序,需要自己写一个windows的事件循环机制。进入事件循环后,实际上是在等待用户的操作。
比如用户点击退出,会触发windows退出事件的操作。
点击按钮,会触发按钮点击事件 .. (2019-08-16 16:03) 
#9 [fsu0413 08-17 20:13]
没有QEventLoop的话,系统事件怎么处理?
如果把main函数中的exec调用换成for(;;) 的死循环,程序还是一样不退出,但是你的界面八成是出不来的,即使出来也不会好用,因为没有处理事件相关的代码。
QEventLoop并不只是处理系统事件,它还处理队列(注意不是跨线程)的信号槽调用。
它可能还处理其他的内容,我没有具体研究过,有兴趣的话可以研究下。
#10 回 笑颜 的帖子 [手可摘星辰 09-05 20:29]
笑颜:Qt的事件循环是什么? 可以这样给你解释。
假设我们写个简单的main函数,如果没有任何阻塞,那么这个main函数很快就结束了,那么一般情况下进程就结束了。
事件循环就相当于在main函数里面写了个while(1);让main函数一直不结束,进程就一直不会退出。
然后,我们知道对于界面程序 .. (2019-08-13 20:43) 
认同

<< 1 2 3 >> (2/3)

回复 发表
主题 版块