Skip to content

效果图

Description

CEF(helper)独立子进程

主进程 sub-process/main-process

go
package main

import (
	"embed"
	"fmt"
	"github.com/energye/energy/v2/cef"
	"github.com/energye/energy/v2/cef/process"
	"github.com/energye/energy/v2/common"
	"github.com/energye/energy/v2/example/sub-process/main-process/src"
	"github.com/energye/energy/v2/logger"
	"github.com/energye/energy/v2/pkgs/assetserve"
	"github.com/energye/golcl/pkgs/macapp"
	"os"
	"path"
)

//go:embed resources
var resources embed.FS

/*
主进程
这个示例演示了 主进程和 子进程相互独立出来,
步骤
 1. 先编译好子进程程序
    cd sub-process
    go build
    sub-process.exe
 2. 将子进程执行文件(sub-process.exe)在主进程SetBrowseSubprocessPath配置,如果在 FrameworkDirPath 可以直接写文件名
 3. 运行主程序
*/
func main() {
	logger.SetEnable(true)
	logger.SetLevel(logger.CefLog_Debug)
	//MacOS通过指定 IsCEF ,在开发环境中自动生成可运行的程序包
	//MacOS配置要在 GlobalInit 它之前
	//特别说明MacOS:子进程不需要配置
	wd, _ := os.Getwd()
	if common.IsDarwin() {
		//主进程中 主子进程方式,在这里指定子进程的执行文件
		subExePath := path.Join(wd, "example", "sub-process", "sub-process", "sub-process")
		macapp.MacApp.SetBrowseSubprocessPath(subExePath)
	}
	process.Args.ProcessType()
	//CEF全局初始化
	cef.GlobalInit(nil, &resources)
	//Cef应用的配置 执行程序如果在 chromium 目录中可不配置
	//子进程执行程序如果在 chromium 目录中可不配置
	var subExePath string
	if common.IsWindows() {
		subExePath = path.Join(wd, "example", "sub-process", "sub-process", "sub-process.exe")
	} else if common.IsLinux() {
		subExePath = path.Join(wd, "example", "sub-process", "sub-process", "sub-process")
	} else if common.IsDarwin() {
		//MacOS SetBrowseSubprocessPath 将不起任何作用。
		//独立的子程序包需要在 macapp.MacApp.SetBrowseSubprocessPath 配置
	}
	//subExePath = path.Join(wd, "sub-process.exe")
	println("subExePath", subExePath)
	//创建Cef应用
	cefApp := cef.NewApplication()
	//cefApp.SetSingleProcess(false) //单进程 或 多进程 ,单进程上面的子进程配置就不起作用了
	cefApp.SetBrowserSubprocessPath(subExePath)
	//主进程初始化
	src.MainBrowserInit()
	cef.SetBrowserProcessStartAfterCallback(func(b bool) {
		fmt.Println("主进程启动 创建一个内置http服务")
		//通过内置http服务加载资源
		server := assetserve.NewAssetsHttpServer()
		server.PORT = 22022
		server.AssetsFSName = "resources" //必须设置目录名
		server.Assets = &resources
		go server.StartHttpServer()
	})
	cef.Run(cefApp)
}

(Helper)子进程 sub-process/sub-process

go
package main

import (
	"fmt"
	"github.com/energye/energy/v2/cef"
	"github.com/energye/energy/v2/cef/ipc"
	"github.com/energye/energy/v2/cef/ipc/context"
	"github.com/energye/energy/v2/logger"
)

/*
子进程
这个示例演示了 主进程和 子进程相互独立出来,
子进程需要先编译好,提供给主进程(SetBrowseSubprocessPath)配置
*/
func main() {
	logger.SetEnable(true)
	logger.SetLevel(logger.CefLog_Debug)
	//全局配置初始化
	cef.GlobalInit(nil, nil)
	//创建Cef应用
	cefApp := cef.NewApplication()
	//主进程和子进程的变量绑定函数定义
	//cef.VariableBind.VariableCreateCallback(vars.VariableBind)
	//IPC通信
	IPCInit()
	//启动子进程
	cefApp.StartSubProcess()
	cefApp.Free()
}

// 渲染进程 IPC事件
func IPCInit() {
	fmt.Println("渲染进程IPC事件注册")
	//渲染进程监听的事件
	ipc.On("sub-process-on-event", func(context context.IContext) {
		fmt.Println("sub-process-on-event")
		//渲染进程处理程序....
		context.Result("返回结果")
	})
}

说明

(Helper)子进程启动

通过 app.SetBrowseSubprocessPath 设置子进程执行文件路径让CEF自动启动子进程

场景

大多数应用都应采用该方式

CEF是多进程模型,CEF启动时会同时启动多个子进程,CEF默认会重复执行主应用执行文件。 如果我们使用指定有效子进程执行文件通过 app.SetBrowseSubprocessPath 设置,此时CEF不会重复执行主应用执行文件。

在子进程中,它实际没有关于业务功能代码,并更好的管理主进程代码。