勇哥再谈谈C#中编写halcon代码的内存泄露的问题

今天在群里聊起这个halcon内存泄露的问题。有几点要注意的地方,在此记录下来。


(1)hobject要Dispose,htuple也要Dispose

这一点以前没有注意,好像是受了官方一个贴子影响认为htuple不用管。

但是hlacon导出的C#代码里面,就注意到了这一点,htuple也要Dispose。


(2)被塞入List的halcon对象,注意不能直接List.Clear()

如果你这样做,内存就会泄露。

正确的做法是要把List中所有的halcon对象Dispose掉,再List.Clear()


(3)函数内部想传出外部的halcon对象,都传出它的Clone

而函数内部的局部变量则全部Dispose

image.png

image.png


(4)最好不要在参数里(new htuple("0"))

这样可能也会内存泄露, 这个只是一家之言,勇哥不是太认可,但是先记下。



其它相似话题的贴子见下面:

C#和halcon的混编程序出现序内存泄露、句柄持续增加、视觉程序运行越来越慢等问题的处理

C#和halcon的混编程序出现长时间拍照时程序崩溃问题的解决经验

halcon窗体无响应和占用cpu时间长的问题



另外补充一下勇哥在之前贴子中谈到过的halcon官方声明的原则,放在这里方便各位参考:

摘自halcon文档:

The .net philosophy is to let the garbage collector remove unused objes. However,
 because the garbage collector detects unused objects only from time to time, 
 the used memory increases in the meantime. Even more important is that, 
 to the garbage collector, Halcon's iconic variables(image,regions,...) 
 seem to be rather "small",because they only contains a reference to the 
 (in many cases rather large) iconic objects in the database. Thus ,
 the garbage collector may free such variables even if they are not used anymore.
 Therefor, you need to force the removal of (unused) objects. There are two ways to do this:

1) Call the garbage collector mannually . In the example Matching ,
this is done after each processing run in the timer event:

private void Timer_Tick(object sender, System.EventArgs e)
{
Action();
GC.Collect();
GC.WaitForPendingFinalizers():
}

C++ applications

GC::Collect():
GC::WaitForPendingFinalizers();

2) Dispose of individual objects manually by calling the method Dispose:

HImage  Image = new HImage("fuse");
...

Image.Dispose():

总结成一句话就是: 对象在使用前后都需要Dispose()

更准确的说是HObject 这样的变量,使用前后都要Dispose()。

另外对于局部与全部的HObject对象使用上有点区别:

对于局部的HObject对象只要注意在使用前后都要Dispose()即可。

但是对于全局的HObject对象,则可以参考下面的处理方式。

 HObject liveImage = null;
  HObject ExpGet_liveImage()
  {
     return liveImage;
  }
 
  void ExpSet_liveImage(HObject obj)
  {
      if (liveImage != null)
      liveImage.Dispose();
      liveImage = obj.CopyObj(1, -1); 
      //如果直接liveImage=obj是不可以的,因为当Dispose后全局变量变量也会被注销。
  }


--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年5月    »
12345
6789101112
13141516171819
20212223242526
2728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864