CEF中Browser程序與Render程序間通訊

2021-09-10 19:22:29 字數 3861 閱讀 8459

提到了cef提供的browser與browser程序通訊的幾種機制,我實驗了process runtime messages這種方式,用到了cefprocessmessage和cefbrowser::sendprocessmessage()。

我是在cef中js與c++互動一文的基礎上完成的,我們邊說基本步驟,邊給出關鍵**。

傳送訊息使用cefbrowser::sendprocessmessage() ,sendprocessmessage第乙個引數是cefprocessid,給browser程序傳送,就用pid_browser,給render程序傳送,就用pid_renderer。

我在render程序傳送訊息的**如下(clientv8handler的execute方法內):

cefrefptrmsg = cefprocessmessage::create("login_msg");        // retrieve the argument list object.        cefrefptrargs = msg->getargumentlist();        // populate the argument values.        args->setsize(2);        args->setstring(0, struser);        args->setstring(1, strpassword);        // send the process message to the browser process.        cefv8context::getcurrentcontext()->getbrowser()->sendprocessmessage(pid_browser, msg);
我把那個cef_js_integration示例中收到的登陸訊息(render程序)傳送給browser程序。

browser程序這邊,重寫cefclient::onprocessmessagereceived()這個方法來處理跨程序訊息。

以cef_js_integration為例,是在clienthandler中重寫了onprocessmessagereceived方法:

bool clienthandler::onprocessmessagereceived(cefrefptrbrowser,    cefprocessid source_process,    cefrefptrmessage);        _stprintf_s(szlog, 256, _t("browserprocess, user - %s, password - %s\r\n"), struser.c_str(), strpassword.c_str());        outputdebugstring(szlog);        //send reply to render process        cefrefptroutmsg = cefprocessmessage::create("login_reply");        // retrieve the argument list object.        cefrefptrreplyargs = outmsg->getargumentlist();        // populate the argument values.        replyargs->setsize(1);        replyargs->setint(0, 0);        // send the process message to the renderer process.        browser->sendprocessmessage(pid_renderer, outmsg);        return true;    }    return false;}
可以看到,上面的**又給render程序發了個訊息。

好啦,這就是整個過程了。

其他參考文章:

再分享一下我老師大神的人工智慧教程吧。零基礎!通俗易懂!風趣幽默!還帶黃段子!希望你也加入到我們人工智慧的隊伍中來!

提到了cef提供的browser與browser程序通訊的幾種機制,我實驗了process runtime messages這種方式,用到了cefprocessmessage和cefbrowser::sendprocessmessage()。

我是在cef中js與c++互動一文的基礎上完成的,我們邊說基本步驟,邊給出關鍵**。

傳送訊息使用cefbrowser::sendprocessmessage() ,sendprocessmessage第乙個引數是cefprocessid,給browser程序傳送,就用pid_browser,給render程序傳送,就用pid_renderer。

我在render程序傳送訊息的**如下(clientv8handler的execute方法內):

cefrefptrmsg = cefprocessmessage::create("login_msg");        // retrieve the argument list object.        cefrefptrargs = msg->getargumentlist();        // populate the argument values.        args->setsize(2);        args->setstring(0, struser);        args->setstring(1, strpassword);        // send the process message to the browser process.        cefv8context::getcurrentcontext()->getbrowser()->sendprocessmessage(pid_browser, msg);
我把那個cef_js_integration示例中收到的登陸訊息(render程序)傳送給browser程序。

browser程序這邊,重寫cefclient::onprocessmessagereceived()這個方法來處理跨程序訊息。

以cef_js_integration為例,是在clienthandler中重寫了onprocessmessagereceived方法:

bool clienthandler::onprocessmessagereceived(cefrefptrbrowser,    cefprocessid source_process,    cefrefptrmessage);        _stprintf_s(szlog, 256, _t("browserprocess, user - %s, password - %s\r\n"), struser.c_str(), strpassword.c_str());        outputdebugstring(szlog);        //send reply to render process        cefrefptroutmsg = cefprocessmessage::create("login_reply");        // retrieve the argument list object.        cefrefptrreplyargs = outmsg->getargumentlist();        // populate the argument values.        replyargs->setsize(1);        replyargs->setint(0, 0);        // send the process message to the renderer process.        browser->sendprocessmessage(pid_renderer, outmsg);        return true;    }    return false;}
可以看到,上面的**又給render程序發了個訊息。

好啦,這就是整個過程了。

其他參考文章:

找不到r低版本 R的多程序使用與改進

在r中需要使用多程序時,常見方案是使用foreach和doparallel的組合。foreach包中最重要的是foreach函式,該函式建立乙個foreach物件,隨後序列或並行的執行表示式。library foreach foreachout foreach combine,init,final ...

Python中「 r」與「 n」區別

print asdfg nss end print asdfg r nss end print asdfg rss end 直接輸出,第一行和第三行的結果是一樣的。asdfg ss p.s.第二行的結果是在中間空了一行 但是,切換到終端後再執行第一行和第三行的結果有了明顯不同 print asdfg...

Python中 r與 s的區別

r是rper 方法處理的物件 s是str 方法處理的物件 其實有些情況下,兩者處理的結果是一樣的,比如說處理資料型別為int型物件 例如1 print i am d year old.22 print i am s year old.22 print i am r year old.22 返回的結果...