mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-24 18:50:56 +08:00
feat(WindowService): add main window monitor for renderer process events (#5532)
* feat(WindowService): add main window monitor for renderer process events * fix(WindowService): enhance renderer process crash handling to improve application stability
This commit is contained in:
parent
457c8e05da
commit
49658c6437
@ -25,6 +25,7 @@ export class WindowService {
|
||||
private selectionMenuWindow: BrowserWindow | null = null
|
||||
private lastSelectedText: string = ''
|
||||
private contextMenu: Menu | null = null
|
||||
private lastRendererProcessCrashTime: number = 0
|
||||
|
||||
public static getInstance(): WindowService {
|
||||
if (!WindowService.instance) {
|
||||
@ -103,9 +104,32 @@ export class WindowService {
|
||||
this.setupWindowEvents(mainWindow)
|
||||
this.setupWebContentsHandlers(mainWindow)
|
||||
this.setupWindowLifecycleEvents(mainWindow)
|
||||
this.setupMainWindowMonitor(mainWindow)
|
||||
this.loadMainWindowContent(mainWindow)
|
||||
}
|
||||
|
||||
private setupMainWindowMonitor(mainWindow: BrowserWindow) {
|
||||
mainWindow.webContents.on('render-process-gone', (_, details) => {
|
||||
Logger.error(`Renderer process crashed with: ${JSON.stringify(details)}`)
|
||||
const currentTime = Date.now()
|
||||
const lastCrashTime = this.lastRendererProcessCrashTime
|
||||
this.lastRendererProcessCrashTime = currentTime
|
||||
if (currentTime - lastCrashTime > 60 * 1000) {
|
||||
// 如果大于1分钟,则重启渲染进程
|
||||
mainWindow.webContents.reload()
|
||||
} else {
|
||||
// 如果小于1分钟,则退出应用, 可能是连续crash,需要退出应用
|
||||
app.exit(1)
|
||||
}
|
||||
})
|
||||
|
||||
mainWindow.webContents.on('unresponsive', () => {
|
||||
// 在升级到electron 34后,可以获取具体js stack trace,目前只打个日志监控下
|
||||
// https://www.electronjs.org/blog/electron-34-0#unresponsive-renderer-javascript-call-stacks
|
||||
Logger.error('Renderer process unresponsive')
|
||||
})
|
||||
}
|
||||
|
||||
private setupMaximize(mainWindow: BrowserWindow, isMaximized: boolean) {
|
||||
if (isMaximized) {
|
||||
// 如果是从托盘启动,则需要延迟最大化,否则显示的就不是重启前的最大化窗口了
|
||||
|
||||
Loading…
Reference in New Issue
Block a user