关于插件退出释放
作者您好,我在开发一个定时调用API的自定义插件,当前功能已经开发完成。
遇到的问题是: 1、插件内部使用了定时器,会持续调用,点击软件的退出后,定时器没有完全退出,需要通过kill或者任务管理器才能释放进程。 2、我使用的是mingw开发,不涉及界面。 3、在自测的时候,监听信号量是能够正常退出进程的。切换成DLL调用的方式,暂时没能想到有什么其他办法可以正常退出定时器,或者是强制退出定时器。
期望解决方案: 1、我的插件在定时器中尝试关联信号量,但是没有效果,希望能够在释放插件的代码中新增“调用插件的释放函数”。 2、主程序退出的时候做个延迟退出,同时发起一个异步的cmd调用,如果检测到进程还在,通过更激进的kill命令来释放,不过我担心这样操作会导致没有释放TrafficMonitor.sys文件。 3、如果前两种方案不妥,又担心影响旧的插件,能否新增一个开关,根据插件的接口version,来判断要不要调用释放接口。
结语: 我使用TrafficMonitord的方式 ,基本都是一直常驻在后台,所以也不涉及退出的场景,因此不着急解决。我只是如果能够适配插件的多线程模式,应该给软件、插件提供更多有意思的玩法。
祝您生活愉快~
我找了windows的动态库加载文档,尝试使用DllMain,发现是可以在插件被卸载的时候触发,因此我在插件内部调用了线程清理,但是结果还是有僵尸进程存在。 最后我选择了更加激进的std::terminate();让它彻底退出,在process_delete运行完成后,过了大约3-5秒,任务管理器中的Traffic进程就退出了。
// DllMain 函数
BOOL APIENTRY DllMain(HMODULE hModule,DWORD ul_reason_for_call, LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
// DLL 被加载
break;
case DLL_THREAD_ATTACH:
// 线程被创建
break;
case DLL_THREAD_DETACH:
// 线程被销毁
break;
case DLL_PROCESS_DETACH:
// DLL 被卸载
process_delete(); // 确保清理工作
std::terminate(); // 强制退出程序
break;
}
return TRUE;
}
插件接口之所以没有做退出接口,主要是考虑到TrafficMonitor的使用场景,多数用户在启动TrafficMonitor之后不会主动退出,而是直接关机,此时TrafficMonitor进程是会被直接终止的。 如果需要在插件中进行一些资源释放的操作,可以在插件类(ITMPlugin的派生类)的析构函数中执行,当TrafficMonitor退出时,插件类的析构函数会被执行。