线程和事件循环

本文详细介绍了QT中线程的概念,包括可重入与线程安全的区别,并深入探讨了事件循环的工作原理,解释了事件如何产生并被分发到目标对象的过程。

来源:https://www.devbean.net/2013/11/qt-study-road-2-thread-and-event-loop/
1.线程
可重入的(Reentrant):如果多个线程可以在同一时刻调用一个类的所有函数,并且保证每一次函数调用都引用一个唯一的数据,就称这个类是可重入的。如果该函数允许多个线程在同一时刻调用,而每一次的调用都只能使用其独有的数据。全局变量就不是函数独有的数据,而是共享的。换句话说,这意味着类或者函数的使用者必须使用某种额外的机制(比如锁)来控制对对象的实例或共享数据的序列化访问。
线程安全(Thread-safe):如果多个线程可以在同一时刻调用一个类的所有函数,即使每一次函数调用都引用一个共享的数据,就说这个类是线程安全的。如果多个线程可以在同一时刻访问函数的共享数据,就称这个函数是线程安全的。
进一步说,对于一个类,如果不同的实例可以被不同线程同时使用而不受影响,就说这个类是可重入的;如果这个类的所有成员函数都可以被不同线程同时调用而不受影响,即使这些调用针对同一个对象,那么我们就说这个类是线程安全的。

2.事件循环
事件并不是一产生就被分发。事件产生之后被加入到一个队列中,该队列即被称为事件队列。事件分发器遍历事件队列,如果发现事件队列中有事件,那么就把这个事件发送给它的目标对象。这个循环被称作事件循环。

事件可以由程序生成,也可以在程序外部生成。例如:

1.QKeyEvent和QMouseEvent对象表示键盘或鼠标的交互,通常由系统的窗口管理器产生;
2.QTimerEvent事件在定时器超时时发送给一个QObject,定时器事件通常由操作系统发出;
3.QChildEvent在增加或删除子对象时发送给一个QObject,这是由 Qt 应用程序自己发出的。

事件循环的伪代码描述大致如下所示:

while (is_active)
{
//事件队列不为空
    while (!event_queue_is_empty) {
    //进入下个事件
        dispatch_next_event();
    }
    wait_for_more_events();
}

while会遍历整个事件队列,发送从队列中找到的事件;
wait_for_more_events();阻塞事件循环,直到又有新的事件产生。可以被以下几种情况唤醒。

1.窗口管理器的动作(键盘、鼠标按键按下、与窗口交互等);
2.套接字动作(网络传来可读的数据,或者是套接字非阻塞写等);
3.定时器;
4.由其它线程发出的事件。

这里写图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值