標籤:間隔 設定 http false xpl ade 頻繁 事件 instance
初次寫部落格,可能有點亂, 按照自己的實際經曆談一下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_OBJECTpublic:static WebMessageHelper* instance();void postMessage(qint64 delay_ms);void start();void stop();private:explicit WebMessageHelper(QObject *parent = 0);signals:void newMessage();private slots:void doWork();private:QTimer* mTimer;static const int MESSGET_INTERVAL = 10;};#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 > 0){delay_ms = delay_ms > 20 ? 20 : delay_ms;QTimer::singleShot(delay_ms, this, &WebMessageHelper::newMessage);}else{emit newMessage();}}void WebMessageHelper::start(){mTimer->start();}void WebMessageHelper::stop(){mTimer->stop();}
---------------------
漫步繁華街
原文:79237124
【轉】QT CEF3 訊息迴圈處理