Qt - 此刻对Qt事件、调度、线程的理解

QCoreApplication app(argc, argv) //主要是设置线程相关的数据(QThreadData),事件调度器(QAbstractEventDispatcher)每个线程都有各自的事件调度器
return app.exe() //启动一个事件循环来分发事件(主事件循环),底层是QEventLoop::exec()
QEventLoop::exec() //通过循环不断调用(QEventLoop::ProcessEvents())来分发事件队列中的事件,底层是事件调度器在分发事件
QCoreApplication::postEvent() //在一个线程中再开一个事件循环,一个线程可开多个事件循环,但多个事件循环对应的事件调度器为同一个
QCoreApplication::sendEvent()
QCoreApplication::processEvent() //分发事件并清空事件并等待唤醒事件调度器
QCoreApplication::sendPostedEvents() //分发事件并清空事件队列并立刻返回
postEvent() //不阻塞
sendEvent() //阻塞,相比postEvent简化了一切中间流程
//分别对应事件循环的两个不同阶段

 

Qt事件调度器 QEventDispatcherUNIX,底层是poll(),依次执行事件循环中的所有事件
Qt提供5个级别的事件处理和过滤
1、重新实现事件函数
2、重新实现QObject::event()
3、安装事件过滤器
4、在QApplication上安装事件过滤器
5、重新实现QApplication的notify方法
deleteLater:线程安全删除QObject的对象
MVC 模型/视图机制:MOC200 qml就是这种机制

 

事件:传递/透传/循环
信号与槽:信号源/信号/槽函数
元对象系统:Meta-Object System,每个QObject类都有一个元对象QMetaObject
元对象在运行时创建,元对象系统是一个运行时类型信息机制(RTTI)
包含:类的名称、父类的名称、对象的属性、信号和槽信息,这些信息可以通过QObject::metaObject()获取


同线程和非同线程:
同一线程中=单线程模式
非同一线程,同父对象=单线程模式
非同一线程,不同父对象=通过事件循环机制,将A线程执行信号,B线程执行槽函数

Q_OBJECT作用/moc实现原理(注册自定义类型):Q_OBJECT宏标记该类用到元对象系统,编译器会自动生产元对象代码

线程与QObject:每个QObject都有一个依附的线程,即所在的线程,且QObject不是线程安全的

QThread概念:
1、QThread对象所在的线程:创建子线程的线程
2、QThread对象所管理的线程:被创建的子线程

事件:QEventLoop::exec()可开启一个新的事件循环来分发事件(相同的线程事件调度器是同一个)
主事件循环:QCoreApplication::exec()接收来自系统的事件,并转换为QT事件,并分发到对应应用程序窗口上

 

posted @ 2025-04-22 16:18  Citrusliu  阅读(27)  评论(0)    收藏  举报