NERvGear / SAO-Utils

SAO Utils Development & Bug Tracking (Repository Mirror)
https://nvg.dev/core/sao-utils/
220 stars 13 forks source link

qml QObject 在SAO utils 2退出时无法正确地释放资源 #57

Open lifegpc opened 2 years ago

lifegpc commented 2 years ago

继承QObject的类在退出SAO utils 2时,析构函数没有被调用 image

我这里需要释放Socket同时必要时杀死C#写的服务器 插件源代码仓库: https://github.com/lifegpc/com.lifegpc.smtc

GPBeta commented 2 years ago

居然这么快有新的开发者,你是通过 qml plugin 实现的吗?

lifegpc commented 2 years ago

居然这么快有新的开发者,你是通过 qml plugin 实现的吗?

是,结合cpp与C#写的后端通信

GPBeta commented 2 years ago

先不考虑为什么没有调用你的析构函数。 因为 C艹 的标准没有定义异常退出时的析构处理,即便正常退出能够通知关闭你的外部进程,但是崩溃的时候也无法保证。 所以现在流行的做法是:

  1. 服务端主动检查主程序是否仍在运行;
  2. JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE + AssignProcessToJobObject()

再回到你原来的问题,你具体的测试 Qt 版本和 VC-LTL 版本是?

GPBeta commented 2 years ago

对了,既然你的扩展不得不新起一个进程,我比较推荐你一不做二不休连 QML Plugin 也别写了,直接走 websocket 或者其他网络协议。这样有两个好处:

  1. 不用考虑 ABI 兼容问题,即便日后我们升级到 Qt 6 你也不用重新编译 QML Plugin;
  2. 如果后面有其他项目需要这个 SMTC 功能,也可以直接复用这些网络接口。

参考项目:https://nvg.dev/Mashiro_Sorata/ADV-Plugin

lifegpc commented 2 years ago

再回到你原来的问题,你具体的测试 Qt 版本和 VC-LTL 版本是?

与SAO Utils 在用的版本一致

lifegpc commented 2 years ago

对了,既然你的扩展不得不新起一个进程,我比较推荐你一不做二不休连 QML Plugin 也别写了,直接走 websocket 或者其他网络协议。这样有两个好处:

1. 不用考虑 ABI 兼容问题,即便日后我们升级到 Qt 6 你也不用重新编译 QML Plugin;

2. 如果后面有其他项目需要这个 SMTC 功能,也可以直接复用这些网络接口。

参考项目:https://nvg.dev/Mashiro_Sorata/ADV-Plugin

我看看

lifegpc commented 2 years ago

问一下那些 qml plugin 的定义哪里可以找到

lifegpc commented 2 years ago

尝试了一下用ws,发现qml的js严重缺少各类API,还是c++ plugin好整一点。

GPBeta commented 2 years ago

QML 的确缺了一些浏览器提供的 JS 功能,不过大多用组件补回来了 https://doc.qt.io/qt-5/qml-qtwebsockets-websocket.html 毕竟音频可视化那么大吞吐量的功能都能实现,用来获取 SMTC 信息应该也够用了。目前唯一想到的问题是封面图片的数据,可能要通过本地 http:// 服务器提供,如果懒的话用临时文件 file:// 也没有太大问题。

还有因为数据都是全局一致的,SMTCSessionManager 可以使用 qmlRegisterSingletonType() 注册为单例。