bmrlab / gendam

A privacy-first generative DAM
6 stars 1 forks source link

Tauri 无法处理由 Command + Q 导致的 App 退出事件,导致一些子进程无法被 kill #21

Closed web3nomad closed 1 month ago

web3nomad commented 2 months ago

先 close 了,现在应该只有 qdrant 是常驻的进程,目前只处理了这个。

还没有考虑特殊异常导致 tauri::WindowEvent::Destroyed 事件没有被触发,现在没有这方面的实践经验,遇到了再说,留意下,网上查了下 tauri 并没有什么好的办法来管理自己的子进程,只能自己小心处理。

还有就是如果监听 QdrantServerPayload::Kill 的那个线程挂了,一样可能会导致 qdrant 无法被 kill https://github.com/bmrlab/tauri-dam-test-playground/blob/main/crates/vector-db/src/qdrant.rs#L152

可以考虑记录 pid。

刚遇到了前面提到的“特殊异常”,mac 上的 force quit,或者 command + q 退出 app 并不会和点击左上角 x 按钮一样触发 Destroyed 事件,结果是 qdrant 还在运行。

这个问题我单独新建个 issue,寻求帮助 ...

ZingerLittleBee commented 2 months ago

可以在前端添加如下代码,preventDefault() 阻止事件传递,自行处理程序退出逻辑

document.addEventListener('keydown', event => {
    if (event.metaKey && event.key === 'q') {
        event.preventDefault()
        console.log('Cmd + Q is pressed.')
        // 例如,可以调用 Tauri API 关闭窗口
        /**
                {
                  "allowlist": {
                    "process": {
                      "all": false,
                      "exit": true
                    }
                  }
                */
        // import { exit } from '@tauri-apps/api/process'
        // exit(0)
    }
    if (event.metaKey && event.key === 'w') {
        event.preventDefault()
        console.log('Cmd + Q is pressed.')
        // 例如,可以调用 Tauri API 关闭窗口
        // exit(0)
    }
})
web3nomad commented 2 months ago

可以在前端添加如下代码,preventDefault() 阻止事件传递,自行处理程序退出逻辑

document.addEventListener('keydown', event => {
  if (event.metaKey && event.key === 'q') {
      event.preventDefault()
      console.log('Cmd + Q is pressed.')
      // 例如,可以调用 Tauri API 关闭窗口
      /**
                {
                  "allowlist": {
                    "process": {
                      "all": false,
                      "exit": true
                    }
                  }
                */
      // import { exit } from '@tauri-apps/api/process'
      // exit(0)
  }
  if (event.metaKey && event.key === 'w') {
      event.preventDefault()
      console.log('Cmd + Q is pressed.')
      // 例如,可以调用 Tauri API 关闭窗口
      // exit(0)
  }
})

牛逼,这个做法可以 。。。

web3nomad commented 1 month ago

cmd + q 的这种关闭,也可以被 mac 的 quit 菜单触发,这时候捕捉不到。

监听关闭事件的方式可能不大完备。

ZingerLittleBee commented 1 month ago

cmd + q 的这种关闭,也可以被 mac 的 quit 菜单触发,这时候捕捉不到。

监听关闭事件的方式可能不大完备。

tauri 暂不支持右键 dock 的 api issue

实在不行可以隐藏 dock 图标

// don't show on the taskbar/springboard
#[cfg(target_os = "macos")]
app.set_activation_policy(tauri::ActivationPolicy::Accessory);
web3nomad commented 1 month ago

不处理这个问题了,其实 app 退出没有停掉 qdrant 没关系,只要重新启动可以继续正常工作就行。

程序主动记录下 qdrant 的 pid,并且支持动态端口