首页| 论坛| 消息

标题:事件循环是什么?
作者:介农酥
日期:2019-08-13 19:49
内容:

QT的事件循环是什么,一直不是很理解。
比如QEventLoop的本地循环,线程的exec(),qApp的exec()等。
返回到事件循环又是什么意思?

20190816增加
exec()后面的代码无法执行,前面的代码造成的任何结果都可以运行,比如connect,计时器,事件对吧,那其他线程给他发信号他会处理吗,应该会,对吧。那这个QEventLoop本地循环呢,这个本地循环应该只响应本地的(从线程开始到loop.exec())的事件吧,那线程的exec()只响应线程的内的事件吗,这个似乎不对,应该其他线程可以给它发信号,主线程循环是否就是响应主线程及其子线程所有的事件,这样理解对吗?


#1 [笑颜 08-13 20:43]
Qt的事件循环是什么? 可以这样给你解释。
假设我们写个简单的main函数,如果没有任何阻塞,那么这个main函数很快就结束了,那么一般情况下进程就结束了。
事件循环就相当于在main函数里面写了个while(1);让main函数一直不结束,进程就一直不会退出。
然后,我们知道对于界面程序来说,用户在界面上做任何事情都是随机的,比如点击一下鼠标,按下一个按键。那么要怎么来处理这些随机的操作呢? 那就是事件循环。
其实事件循环可以想象成一个一个的回调函数封装,根据不同的事件类型进入事先写好的事件处理函数,也就是回调函数。

所以,最终解释事件循环就是,一个容器,装了一些用户触发的事件,然后在while(1)循环里面一直遍历这个容器(当然,触发的时候装进去,处理之后删掉),有事件就调用事件的处理函数,没有就处理一些其他的事情(当然,你什么也不做也可以),最后你想应用程序退出,当然就结束这个while循环了。
#2 [fsu0413 08-13 22:35]
事件循环不是Qt的概念,而是应用程序的概念。
本质来说,就是用来接收事件并调用事件响应函数的循环。
#3 [ustone 08-14 13:35]
学过Windows程序设计第一章就知道了。
#4 回 笑颜 的帖子 [介农酥 08-16 13:08]
笑颜:Qt的事件循环是什么? 可以这样给你解释。
假设我们写个简单的main函数,如果没有任何阻塞,那么这个main函数很快就结束了,那么一般情况下进程就结束了。
事件循环就相当于在main函数里面写了个while(1);让main函数一直不结束,进程就一直不会退出。
然后,我们知道对于界面程序 .. (2019-08-13 20:43) 
exec()后面的代码无法执行,前面的代码造成的任何结果都可以运行,比如connect,计时器,事件对吧,那其他线程给他发信号他会处理吗,应该会,对吧。那这个QEventLoop本地循环呢,这个本地循环应该只响应本地的(从线程开始到loop.exec())的事件吧,那线程的exec()只响应线程的内的事件吗,这个似乎不对,应该其他线程可以给它发信号,主线程循环是否就是响应主线程及其子线程所有的事件,这样理解对吗?
#5 回 介农酥 的帖子 [笑颜 08-16 15:54]
介农酥:exec()后面的代码无法执行,前面的代码造成的任何结果都可以运行,比如connect,计时器,事件对吧,那其他线程给他发信号他会处理吗,应该会,对吧。那这个QEventLoop本地循环呢,这个本地循环应该只响应本地的(从线程开始到loop.exec())的事件吧,那线程的exec()只响应线程的 .. (2019-08-16 13:08) 
在这里如果我们只考虑Qt的事件循环,那么可以继续描述。
事件循环相当于是一个阻塞的操作,所以不管在哪个线程里面启动起来就没办法再执行后面的指令。
Qt的事件循环就是用QEventLoop来做的,如果你在事件循环里面再嵌套一个事件循环,肯定也是不能再执行后面的指令,但是你嵌套的那个事件循环是可以处理所有的事件的(包括外层的循环里的事件,exec有个参数指定处理事件类型)
然后不同的线程里面都可以启动一个事件循环,另外跨线程的信号传递,一般情况下都是封装成一个回调函数的事件,派发到指定的线程事件循环里面执行,所以是线程安全的。
每个线程里面的事件循环都是独立的,但是同一个线程里面的多个事件循环应该是共享同一个事件队列的。

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

回复 发表
主题 版块