CEF JS 执行CefV8Handler 中的函数,CefV8Handler 中向主进程发送进程消息,等主进程处理完后,将返回值返回给渲染进程,渲染进程收到返回值后 让CefV8Handler 返回数据给JS,注意是同步完成,不是异步

CEF JS 执行CefV8Handler 中的函数,CefV8Handler 中向主进程发送进程消息,等主进程处理完后,将返回值返回给渲染进程,渲染进程收到返回值后 让CefV8Handler 返回数据给JS,注意是同步完成,不是异步 混沌剑魔 发布于:2024-01-16 16:10:55

在CEF中,由于JavaScript执行是在渲染进程中进行的,而主进程是独立于渲染进程的,所以无法直接在CefV8Handler中向主进程发送进程消息并同步获取返回值。CEF的进程间通信是异步的,无法直接实现同步返回值给JavaScript。

如果需要在CefV8Handler中向主进程发送进程消息,并等待主进程处理完后将返回值返回给渲染进程,可以通过以下步骤实现:

  1. CefV8Handler中,向主进程发送进程消息,并在消息中携带一个唯一的标识符(例如,请求ID)。

    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

    bool MyMessageHandler::OnProcessMessageReceived(CefRefPtr browser, CefProcessId source_process, CefRefPtr message) {
        if (message->GetName() == \"my_response\") {
            int requestId = message->GetArgumentList()->GetInt(0);
            CefRefPtr result = message->GetArgumentList()->GetValue(1);
    
            // 通知等待的CefV8Handler,将结果返回给JavaScript
            {
                std::unique_lock lock(resultMutex_);
                auto it = resultMap_.find(requestId);
                if (it != resultMap_.end()) {
                    it->second->Signal();
                    resultMap_[requestId] = result;
                }
            }
            return true;
        }
        return false;
    }

通过以上步骤,可以在CefV8Handler中向主进程发送进程消息,并等待主进程处理完后将返回值返回给渲染进程。在主进程中,接收到进程消息后进行处理,并将处理结果发送回渲染进程。在渲染进程中,接收到主进程发送的处理结果后,将结果返回给CefV8Handler,从而实现同步返回值给JavaScript。

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