【转】QT CEF3 消息循环处理
初次写博客,可能有点乱, 按照自己的实际经历谈一下CEF3钟遇到的一些坑,希望对以后的小伙有些帮助。
先说一下经历,当初第一次接触CEF3的时候,没做特殊处理,直接将cef3封装成控件,嵌入到QT程序中,结果QT就响应不了鼠标事件了,后来经过查资料,发现是cef3的事件循环和QT的事件循环冲突了,所以QT处理不了鼠标事件了,就是鼠标只能点击网页有反应,点击QT控件就没反应。
我们来看一下CEF的消息循环处理机制。cef事件消息循环有两种方式,一种是cef自己处理所有的消息事件(这种情况也就是将cef嵌入到QT中,QT控件都点不动的情况),另一种就是我们程序员手动去处理cef的消息事件(不用怕,这个很简单,就是调用cef的函数就行,具体调用的时机下面会讲到)。这两种消息处理的方式是通过设置
typedef CefStructBase<CefSettingsTraits> CefSettings;
CefSettings.multi_threaded_message_loop = true;//使用CEF3的自动的消息循环处理
// CefSettings.multi_threaded_message_loop = false;//需要程序员手动调用CEF的消息处理函数
// CefDoMessageLoopWork();//手动调用CEF的消息事件处理函数
这里要讲一下手动调用cef事件处理函数的时机。一般情况下我们执行一次CefDoMessageLoopWork();是能处理一次事件循环,所以我们最好设置个定时器,每隔一段时间主动触发一下CefDoMessageLoopWork();
具体每隔多久触发一下这个值得商榷,如果间隔很小,处理的太频繁,对于资源浪费比较严重。但是如果间隔时间太久的话,会造成处理线程饿死。 我一般使用的都是10ms主动触发一下执行事件循环的函数。
所以结果就是程序刚一开始执行的时候,我们打开 定时器,程序关闭的时候关闭定时器,定时器间隔设置为10ms,槽函数就是CefDoMessageLoopWork();
好了,下面贴出来cef消息事件循环的类。
#ifndef WEBMESSAGEHELPER_H
#define WEBMESSAGEHELPER_H #include <QObject> class QTimer;
class WebMessageHelper : public QObject
{
Q_OBJECT
public:
static WebMessageHelper* instance();
void postMessage(qint64 delay_ms); void start();
void stop(); private:
explicit WebMessageHelper(QObject *parent = );
signals:
void newMessage();
private slots:
void doWork();
private:
QTimer* mTimer;
static const int MESSGET_INTERVAL = ;
}; #endif // WEBMESSAGEHELPER_H
#include "webmessagehelper.h"
#include "include/cef_app.h"
#include <QTimer> WebMessageHelper::WebMessageHelper(QObject *parent)
:QObject(parent)
{
mTimer = new QTimer(this);
mTimer->setInterval(MESSGET_INTERVAL);
mTimer->setSingleShot(false);
connect(mTimer, &QTimer::timeout, this, &WebMessageHelper::doWork, Qt::QueuedConnection);
connect(this, &WebMessageHelper::newMessage, this, &WebMessageHelper::doWork, Qt::QueuedConnection);
} WebMessageHelper* WebMessageHelper::instance()
{
static WebMessageHelper helper;
return &helper;
} void WebMessageHelper::doWork()
{
CefDoMessageLoopWork();
} void WebMessageHelper::postMessage(qint64 delay_ms)
{
if(delay_ms > )
{
delay_ms = delay_ms > ? : delay_ms;
QTimer::singleShot(delay_ms, this, &WebMessageHelper::newMessage);
}
else
{
emit newMessage();
}
} void WebMessageHelper::start()
{
mTimer->start();
} void WebMessageHelper::stop()
{
mTimer->stop();
}
---------------------
作者:漫步繁华街
原文:https://blog.csdn.net/xiezhongyuan07/article/details/79237124
【转】QT CEF3 消息循环处理的更多相关文章
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
- Qt for windows消息循环、libqxt分析和wince快捷键处理
Qt for windows消息循环.libqxt分析和wince快捷键处理 利用Qt做windows图形界面开发和MFC相比,个人感觉还是比较简单好用的:首先利用Designer工具搞个ui文件:然 ...
- 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)
最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...
- QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)
使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题.在这里我将记录一下我跟踪QT源码学习到的一些知识. 我的开发环境是VC6.0+QT4.3.3.QT已经不为VC6.0提供addin ...
- QObject::deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象 good
程序编译运行过程很顺利,测试的时候也没发现什么问题.但后来我随手上传了一个1G大小的文件,发现每次文件上传到70%左右的时候程序就崩溃了,小文件就没这个问题.急忙打开任务管理器,这才发现上传文件的时候 ...
- Microsoft Windows的消息循环
https://zh.wikipedia.org/wiki/Microsoft_Windows的訊息迴圈 微软视窗操作系统是以事件驱动做为程序设计的基础.程序的线程会从操作系统获取消息.应用程序会不断 ...
- Android的消息循环机制 Looper Handler类分析
Android的消息循环机制 Looper Handler类分析 Looper类说明 Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在ru ...
- [转]Handler MessageQueue Looper消息循环原理分析
Handler MessageQueue Looper消息循环原理分析 Handler概述 Handler在Android开发中非常重要,最常见的使用场景就是在子线程需要更新UI,用Handler ...
- ios - 图片自动轮播定时器(NSTimer)以及消息循环模式简介
本文只是演示如何设置图片轮播的定时器. 创建全局变量NSTimer 程序启动后就开始轮播图片,所以在- (void)viewDidLoad中就启动定时器. 将定时器放入消息循环池中.- (void)v ...
随机推荐
- 使开发更便捷——Visual Studio 使用技巧——快捷键
下面是.Net开发中常用的快捷键,熟练使用可以提高开发效率: Ctrl + K + C //注释代码 Ctrl + K + U //取消代码注释 Ctrl + k + d //快速格式化代码 Shif ...
- 机器学习之路: python nltk 文本特征提取
git: https://github.com/linyi0604/MachineLearning 分别使用词袋法和nltk自然预言处理包提供的文本特征提取 from sklearn.feature_ ...
- ONVIF开发实例
<开发过过程中的经验总结> ➤工具的使用 (1)首先将文件soapClientLib.c 中"代码"的第二行和第三行注释掉,实际上该文件根本没有用,为了保险起见 ...
- MongoDB 记录
查询操作: db.stu.find() //查询所有数据 db.stu.findOne() //查询一个数据 db.stu.find().pretty() //查询之后,格式化显示 db.stu.fi ...
- DP Training(Updating)
感觉前面做了那么多$dp$全是自己想的还是太少啊…… 好像在LZT的博客上看到了不错的资源?赶紧开坑,以一句话题解为主 Codeforces 419B 第一题就开始盗图 由于只有一个交点,手玩一下发现 ...
- UOJ 310 黎明前的巧克力(FWT)
[题目链接] http://uoj.ac/problem/310 [题目大意] 给出一个数集,A从中选择一些数,B从中选择一些数,不能同时不选 要求两者选择的数异或和为0,问方案数 [题解] 题目等价 ...
- 【HDU】1693:Eat the Trees【插头DP】
Eat the Trees Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Tomcat篇
安装tomcat 先从tomcat官网找到最新的版本下载地址,我找的是Core下的安装包,下载到本地: wget http://mirror.bit.edu.cn/apache/tomcat/tomc ...
- redis-py说明文件(转)
转自:http://blog.sina.com.cn/s/blog_6262a50e0101574h.html 原文:https://github.com/andymccurdy/redis-py r ...
- java8函数式接口小例子
// Function<T, R> -T作为输入,返回的R作为输出 Function<String,String> function = (x) -> {System.o ...