关闭

Qt中的异步事件压缩合并

标签: Qt事件循环异步合并压缩
928人阅读 评论(0) 收藏 举报

曾经在Mindray的UEF框架中大量使用了消息合并机制来解决消息在队列中堆积的问题,一直觉得Qt中也应当存在事件合并机制。


分析过几次Application的EventLoop,没有找到,今天无意中在QCoreApplication::postEvent中找到了。


void QCoreApplication::postEvent(QObject *receiver, QEvent *event, int priority)
{
    //......
    QThreadData * volatile * pdata = &receiver->d_func()->threadData;
    QThreadData *data = *pdata;
    //......
    QMutexUnlocker locker(&data->postEventList.mutex);
    // if this is one of the compressible events, do compression
    if (receiver->d_func()->postedEvents
        && self && self->compressEvent(event, receiver, &data->postEventList)) {
        return;
    }
}



简单几行代码能看出以下信息:

1. Qt事件队列支持多线程,在使用前加锁;

2. Qt的事件队列属于线程,而对象与线程关联;


在QCoreApplication::compressEvent中对以下三类事件进行了压缩合并:

QEvent::Timer

QEvent::DefferedDelete

QEvent::Quit


在QApplication::compressEvent中对以下事件进行了压缩合并:

QEvent::UpdateRequest
QEvent::LayoutHint
QEvent::LayoutRequest
QEvent::Resize
QEvent::Move
QEvent::LanguageChange
QEvent::UpdateSoftKeys
QEvent::InputMethod 
QEvent::LayoutRequest
QEvent::LayoutHint
QEvent::UpdateRequest 
QEvent::Resize 
QEvent::Move 
QEvent::LanguageChange 
QEvent::UpdateSoftKeys 
QEvent::InputMethod


Qt没有开放对自定义事件的压缩合并,可以考虑采取另外两种方式解决:

1. 外部输入,在进入Qt事件队列前进行合并;

2. 内部输入,通过QTimer延迟事件发送,如果在延迟时间内有新的事件到达,则重启定时器;

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3060次
    • 积分:72
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    学习型软件工程师交流群
    在一家传统行业做了10年软件开发与技术管理工作,为自己的软件开发生涯打下了技术基础,但也深切地感受到技术交流的重要性,所以建了下面这个群,希望志同道合者有机会结识与交流。 点击下面图片可加入QQ群(群号342403349):
    学习型软件工程师(C++)
    文章分类
    文章存档