Qt中的异步事件压缩合并

曾经在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延迟事件发送,如果在延迟时间内有新的事件到达,则重启定时器;

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

Qt中的异步事件压缩合并

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭