【轉】QT CEF3 訊息迴圈處理

來源:互聯網
上載者:User

標籤:間隔   設定   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 訊息迴圈處理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.