mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2026-01-08 06:19:05 +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 selectionMenuWindow: BrowserWindow | null = null
|
||||||
private lastSelectedText: string = ''
|
private lastSelectedText: string = ''
|
||||||
private contextMenu: Menu | null = null
|
private contextMenu: Menu | null = null
|
||||||
|
private lastRendererProcessCrashTime: number = 0
|
||||||
|
|
||||||
public static getInstance(): WindowService {
|
public static getInstance(): WindowService {
|
||||||
if (!WindowService.instance) {
|
if (!WindowService.instance) {
|
||||||
@ -103,9 +104,32 @@ export class WindowService {
|
|||||||
this.setupWindowEvents(mainWindow)
|
this.setupWindowEvents(mainWindow)
|
||||||
this.setupWebContentsHandlers(mainWindow)
|
this.setupWebContentsHandlers(mainWindow)
|
||||||
this.setupWindowLifecycleEvents(mainWindow)
|
this.setupWindowLifecycleEvents(mainWindow)
|
||||||
|
this.setupMainWindowMonitor(mainWindow)
|
||||||
this.loadMainWindowContent(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) {
|
private setupMaximize(mainWindow: BrowserWindow, isMaximized: boolean) {
|
||||||
if (isMaximized) {
|
if (isMaximized) {
|
||||||
// 如果是从托盘启动,则需要延迟最大化,否则显示的就不是重启前的最大化窗口了
|
// 如果是从托盘启动,则需要延迟最大化,否则显示的就不是重启前的最大化窗口了
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user