首页 > 系统相关 >C#C++,opencv的dll中detach相关:关于调用dll后程序退出后进程仍然驻留系统列表的问题

C#C++,opencv的dll中detach相关:关于调用dll后程序退出后进程仍然驻留系统列表的问题

时间:2023-11-08 11:34:34浏览次数:39  
标签:调用 C# C++ dll 问题 退出 线程 release

我在c#中调用C++的dll,内部使用了线程并detach使其独立于主线程UI运行。

但后来发现程序关闭后,任务列表中的进场依然存在,即app并未实际正常退出。

这个问题有很多人碰到和争论,但都没有给出明确的答案。

这里提供一个理论解释和绝佳的调试排除方法:

根本原因:程序退出之前,系统(或程序员自己,这个看开发工具)会调用Dll Unload Library,而调用这个实际上去调用dll的析构函数,这个函数一般是隐式的。这里系统会去调用各种基础设施的release。但如果是用户代码存在需要手动release的对象,系统是没办法的。而主线程关闭UI后,变成一直在这里等待系统资源释放。所以问题的根本原因是使用了某些必须手动释放,用户在推出dll工作线程时没有正确清理。

解决方法:首先终止线程,排除各种锁的等待,终止各种循环 while for等;寻找那个需要手动release的对象,包括各种内存和各种component对象,在主线程退出之前,显示调用dll内的方法清理掉。

 

调试排除方法(分段隔离法):

如果你的项目比较复杂,你在releaseApp方法中处理了一系列的对象释放。就是查不到问题在哪里,这时你可以使用return 0 分段作废(分段隔离)掉一些模块和代码过程,然后不断重复编译执行,直到找到问题不出现和出现的交界位置,这时你就找到了问题的所在了。

 

对于我碰到的具体问题是这样的,deteach的子线程顺利退出,但关闭后进程仍然不退出。一开始一直怀疑是deteach的问题,首先确认子线程正确退出, 在排除了mutex,thread等问题后,问题依旧。最后采用分段隔离法,找到了问题。原来是opencv的VideoCapture没有release,这是个组件的问题,由于并非使用new产生的,所以没有主动release导致了问题的产生。

 

如上分享,希望对其他开发者有用。

 

标签:调用,C#,C++,dll,问题,退出,线程,release
From: https://www.cnblogs.com/johnsen/p/17817002.html

相关文章

  • docker日志收集docker插件+loki+grafna
    实现收集docker容器日志方式:dokcer安装插件,将日志发送到loki,grafna展示日志。1、安装lokiwgethttps://raw.githubusercontent.com/grafana/loki/v2.9.1/cmd/loki/loki-local-config.yaml-Oloki-config.yamldockerrun--nameloki-d-v$(pwd):/mnt/config-p3100:3100......
  • flutter doctor 认证问题
    运行flutterdoctor发现sdk需要认证,如下图C:\Users\*****>flutterdoctorFlutterassetswillbedownloadedfromhttps://mirrors.tuna.tsinghua.edu.cn/flutter.Makesureyoutrustthissource!Doctorsummary(toseealldetails,runflutterdoctor-v):[√]Flutte......
  • Pytorch 实现 GAN 网络
    Pytorch实现GAN网络原理GAN的基本原理其实非常简单,假设我们有两个网络,G(Generator)和D(Discriminator)。它们的功能分别是:G是一个生成网络,它接收一个随机的噪声z,通过这个噪声生成伪造数据,记做G(z)。D是一个判别网络,判别数据是不是“真实的”。它的输入参数是x,输出记为D(x)......
  • undefined reference to `add(int, int)'
    一、概述使用cmake编译C++项目报undefinedreferenceto`add(int,int)'项目中有.cpp文件,有.h文件,有.c文件。也就是c和c++混编。其中.cpp文件引用了.c的头文件现象: 从上面可以看出其实这几个.cpp和.c文件都已经编译过了。但是就会提示找不到.c文件中的......
  • C语言程序设计 练习题参考答案 第四章 (2) 二维数组
    /*4.165*5矩阵中每行的绝对值最大值,与同行对角线交换*/#include"stdio.h"#include"math.h"voidmain(){inta[5][5]={{1,2,3,4,-5},{3,5,-2,4,2},{4,1,2,3,-2},{1,3,-2,4,6},{2,2,0,7,4}};inti,k,max,sub,temp;/*i循环变量,控制行,k循......
  • C语言程序设计 练习题参考答案 第四章 (3) 字符数组
     /*  例4.19 电文加密,每个字母转换为字母表中循环右移的第三个字母,解法一 */#include"stdio.h"voidmain(){chars[256];inti=0;printf("请输入一行字符,之后按回车键\n");gets(s);while(s[i]!=0){if(s[i]>=65&&s[i]<=87)/*A-W*/......
  • C语言程序设计 练习题参考答案 第五章 (1) 函数定义调用
    /*5.6编写函数,输出所有水仙花数*/#include"stdio.h"intisdaffodil(intn);/*isdaffodil函数原型声明*/voidmain(){inti;for(i=100;i<=999;i++)if(isdaffodil(i))printf("%5d",i);}intisdaffodil(intn)/*is......
  • C语言程序设计 练习题参考答案 第五章 (2) 递归函数
    /*5.10编写函数,求Fibonacci数列的第n项*/#include"stdio.h"intfibonacci(intn);voidmain(){intn;printf("求Fibonacci数列的第n项,请输入n\n");scanf("%d",&n);/*VC6中n要小于?*/printf("Fibonacci数列的第%d项为%d",n,......
  • C语言程序设计 课程实施细则
    C语言程序设计-课程实施细则课程学时:36+20教材:《C语言程序设计教程》  西安交通大学出版社  张毅坤等编著实验指导书:《C语言程序设计教程学习指南与实验指导》西安交通大学出版社  张毅坤等编著金花校区东门口书店有售。 第1章  概述            ......
  • C语言程序设计 练习题参考答案 第三章 (3) 循环结构
    /*3.9求派的值*/#include"stdio.h"voidmain(){intn;doublesum=0;for(n=1;n<=10000;n++){sum=sum+1.0/(4*n-3)-1.0/(4*n-1);}printf("pi的值为%lf\n",4*sum);}/*3.9求派的值*/#include<stdio.......