初次写博客,可能有点乱, 按照自己的实际经历谈一下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 消息循环处理的更多相关文章

  1. QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数

    QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...

  2. Qt for windows消息循环、libqxt分析和wince快捷键处理

    Qt for windows消息循环.libqxt分析和wince快捷键处理 利用Qt做windows图形界面开发和MFC相比,个人感觉还是比较简单好用的:首先利用Designer工具搞个ui文件:然 ...

  3. 将QT开发的界面程序封装成DLL,在VC中成功调用(必须有消息循环,所以使用了QTWinmigrate,附CSDN可下载的Demo)

    最近手头的一个项目需要做一个QT界面,并且封装成DLL,然后再动态调用DLL给出的接口函数,使封装在DLL内部的QT界面跑起来,在网上查了很多资料,今天终于成功了,经验不敢独享,因为CSDN给了我很多 ...

  4. QT创建窗口程序、消息循环和WinMain函数(为主线程建立了一个QEventLoop,并执行exec函数)

    使用QT也有一段时间了,有的时候需要跟踪代码到QT的源码中去查找问题.在这里我将记录一下我跟踪QT源码学习到的一些知识. 我的开发环境是VC6.0+QT4.3.3.QT已经不为VC6.0提供addin ...

  5. QObject::deleteLater()并没有将对象立即销毁,而是向主消息循环发送了一个event,下一次主消息循环收到这个event之后才会销毁对象 good

    程序编译运行过程很顺利,测试的时候也没发现什么问题.但后来我随手上传了一个1G大小的文件,发现每次文件上传到70%左右的时候程序就崩溃了,小文件就没这个问题.急忙打开任务管理器,这才发现上传文件的时候 ...

  6. Microsoft Windows的消息循环

    https://zh.wikipedia.org/wiki/Microsoft_Windows的訊息迴圈 微软视窗操作系统是以事件驱动做为程序设计的基础.程序的线程会从操作系统获取消息.应用程序会不断 ...

  7. Android的消息循环机制 Looper Handler类分析

    Android的消息循环机制 Looper Handler类分析 Looper类说明   Looper 类用来为一个线程跑一个消息循环. 线程在默认情况下是没有消息循环与之关联的,Thread类在ru ...

  8. [转]Handler MessageQueue Looper消息循环原理分析

    Handler MessageQueue Looper消息循环原理分析   Handler概述 Handler在Android开发中非常重要,最常见的使用场景就是在子线程需要更新UI,用Handler ...

  9. ios - 图片自动轮播定时器(NSTimer)以及消息循环模式简介

    本文只是演示如何设置图片轮播的定时器. 创建全局变量NSTimer 程序启动后就开始轮播图片,所以在- (void)viewDidLoad中就启动定时器. 将定时器放入消息循环池中.- (void)v ...

随机推荐

  1. java把html标签字符转换成普通字符(反转换成html标签)

    package net.jasonjiang.web; import org.junit.Test; import org.springframework.web.util.HtmlUtils; /* ...

  2. ubuntu 安装 theano

    参考博客: http://www.cnblogs.com/anyview/p/5025704.html 1. 安装gfortran, numpy, scipy, sklearn, blas, atla ...

  3. The file will have its original line endings in your working directory.

    在空仓库的情况下,add,出现一下问题 The file will have its original line endings in your working directory. 当报这个警告时是 ...

  4. Leaving Auction CF 749D

    题目:http://codeforces.com/problemset/problem/749/D 题目大意: 有n个人竞拍,也有n个叫牌,一个人可以有多个叫价牌,但也可能有一些人根本不叫价 每个叫牌 ...

  5. 监控cpu、内存 <shell>

    获取cpu.内存结果 pid=$1 #获取进程pid echo $pid interval=1 #设置采集间隔 while true do echo $(date +"%y-%m-%d %H ...

  6. [转]kali中eth0网卡突然消失解决方案

    前言 不知道怎么kali的eth0网卡突然消失了.这可有点难受啊.在网上查找了一番找到了解决办法,特此记录. 问题   怎么办? 解决办法 首先使用ifconfig -a命令查看所有的网卡接口  发现 ...

  7. python-arcade时钟

    最近开始学习arcade的图形库,感觉功能很丰富,尝试画了个时钟,显示如下: 贴上调整好的代码: import arcade import math,time SCREEN_WIDTH = 800 S ...

  8. 获取类的属性并排除特定属性(getType().GetProperties())

    当获取一个类型(class)的所有属性时,想排除指定属性,该如何操作? 比如:EF中一个实体类型UserEntity,通过反射获取这个类的属性时,想排除这个为映射的字段ID 使用以下方法即可! Pro ...

  9. QQ邮件定时发送天气预报

    1.首先利用request库去请求数据,天气预报使用的是和风天气的API(www.heweather.com/douments/api/s6/weather-forecast) 2.利用python的 ...

  10. DMA

    DMA:如果将一串字符串通过串口传送到外设中去,用传统的方法,则CPU将不断的去扫描UTSTAT这个寄存器,在字符发送期间,CPU将不能做任何其他事情.为了解决这个问题,则在诞生了DMA CPU只需要 ...