CEF JS 执行CefV8Handler 中的函数,CefV8Handler 中向主进程发送进程消息,等主进程处理完后,将返回值返回给渲染进程,渲染进程收到返回值后 让CefV8Handler 返回数据给JS,注意是同步完成,不是异步,如果你要使用 event->Wait() ,在这期间OnProcessMessageReceived无法接受消息

CEF JS 执行CefV8Handler 中的函数,CefV8Handler 中向主进程发送进程消息,等主进程处理完后,将返回值返回给渲染进程,渲染进程收到返回值后 让CefV8Handler 返回数据给JS,注意是同步完成,不是异步,如果你要使用 event->Wait() ,在这期间OnProcessMessageReceived无法接受消息 编程骑士 发布于:2024-01-16 16:16:05

非常抱歉,我之前的回答有误。在渲染进程中,调用event->Wait()方法等待事件触发期间,是无法同时接收和处理其他进程消息的,包括OnProcessMessageReceived函数。

如果需要在CefV8Handler中向主进程发送进程消息,并等待主进程处理完后将返回值返回给渲染进程,并且要求同步完成,可以考虑使用以下方法:

  1. CefV8Handler中,向主进程发送进程消息,并等待主进程处理完毕。

    class MyV8Handler : public CefV8Handler {
    public:
        bool Execute(const CefString& name, CefRefPtr object, const CefV8ValueList& arguments, CefRefPtr& retval, CefString& exception) override {
            // 创建一个唯一的请求ID
            int requestId = GenerateRequestId();
    
            // 向主进程发送进程消息,携带请求ID和其他参数
            CefRefPtr message = CefProcessMessage::Create(\"my_message\");
            message->GetArgumentList()->SetInt(0, requestId);
            // 设置其他参数...
            CefRefPtr browser = CefV8Context::GetCurrentContext()->GetBrowser();
            browser->SendProcessMessage(PID_BROWSER, message);
    
            // 等待主进程处理完毕并返回结果
            CefRefPtr event = CefWaitableEvent::CreateWaitableEvent(false, false);
            event->Reset();
            {
                std::unique_lock lock(resultMutex_);
                resultMap_[requestId] = event;
            }
            event->Wait();
    
            // 获取主进程返回的结果
            CefRefPtr result;
            {
                std::unique_lock lock(resultMutex_);
                result = resultMap_[requestId];
                resultMap_.erase(requestId);
            }
    
            // 返回结果给JavaScript
            retval = result;
            return true;
        }
    
    private:
        std::mutex resultMutex_;
        std::map> resultMap_;
    };
  2. 在主进程中,接收到进程消息后进行处理,并将处理结果发送回渲染进程。

    bool MyMessageHandler::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) {
        if (message->GetName() == \"my_message\") {
            int requestId = message->GetArgumentList()->GetInt(0);
            // 处理消息...
            // 执行操作并获取结果
            CefRefPtr result = PerformOperation();
    
            // 将结果发送回渲染进程
            CefRefPtr response = CefProcessMessage::Create(\"my_response\");
            response->GetArgumentList()->SetInt(0, requestId);
            response->GetArgumentList()->SetValue(1, result);
            browser->SendProcessMessage(PID_RENDERER, response);
            return true;
        }
        return false;
    }
  3. 在渲染进程中,接收到主进程发送的处理结果后,将结果返回给CefV8Handler

热门软件
大牛域名采集器 2024最新版软件 一键采集数千万域名的好工具
域名采集器
大牛SEO自动外链工具 2024最新版软件 引蜘蛛工具站长利器
SEO自动外链工具
大牛端口批量扫描器2024最新版软件 多线程批量扫描服务器端口是否开放
端口批量扫描器
大牛网址批量验证工具2024最新版软件 批量检查网址是否能打开
网址批量验证工具
大牛网站标题采集工具2024最新版软件 批量获取网站TDK 标题、关键词、描述
网站标题采集工具
大牛关键词搜网站工具2024最新版软件 根据关键词批量搜索域名支持导出为txt和excel表格
关键词搜网站工具
大牛关键词挖掘工具2024最新版软件 长尾关键词搜索相关词下拉词一键采集
关键词挖掘工具
大牛网站备份扫描器2024最新版软件 批量扫描网站备份文件 多线程速度快
网站备份扫描器
百度网盘批量分享工具
©2015-2023 Niu5.com 软件定制 | 联系我们