Qt中的异步事件压缩合并

原创 2013年12月05日 20:03:24

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

RequireJS对文件合并与压缩实现方法

RequireJS 是一个JavaScript模块加载器。它非常适合在浏览器中使用, 它非常适合在浏览器中使用,但它也可以用在其他脚本环境, 就像 Rhino and Node. 使用RequireJ...
  • u013063153
  • u013063153
  • 2016年09月03日 17:09
  • 2256

自动提取HTML中的JS进行合并与压缩

前段时间公司做网站的优化,其中就有将HTML文件中用到的多个JS压缩成一个min.js。现在做一个总结: css js 压缩用的是 gulp,只要写一个gulpfile.js脚本即可,非常方便 ...
  • wangshu696
  • wangshu696
  • 2016年05月18日 14:09
  • 1063

用UglifyJS2合并压缩混淆JS代码

前言 做Web前端开发,总是要考虑页面的打开速度,如果文件数量越少、文件长度越小,就可以直接的提升网页的访问速度。 但在开发的时候,为了保证代码的可读性,我们写的程序文件会很多而且很大,这...
  • xtgefzhangqing
  • xtgefzhangqing
  • 2015年11月03日 19:11
  • 4229

事件驱动异步文件操作

  • 2007年09月10日 20:34
  • 16KB
  • 下载

利用事件异步通知从HTTP服务器接收文件的程序代码

  • 2003年02月25日 00:00
  • 13KB
  • 下载

C#基于异步事件回调多线程容器

  • 2013年07月25日 16:24
  • 1.56MB
  • 下载

Windows Sockets 7单元 异步事件 源码 + 注释 C++

  • 2012年07月26日 17:56
  • 64KB
  • 下载

c#委托事件异步例子

  • 2013年06月26日 17:10
  • 59KB
  • 下载

wxh 利用事件异步通知从HTTP服务器接收文件的程序代码 .rar

  • 2007年05月10日 20:49
  • 2KB
  • 下载

线程-异步事件委托

  • 2015年02月10日 12:06
  • 70KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt中的异步事件压缩合并
举报原因:
原因补充:

(最多只允许输入30个字)