49、Halcon内存泄露

一、Hobject重复使用

定义出来的图形变量不可以重复利用,即输入和输出不可用同一变量,这样会造成变量不断地叠加,像栈一样,每执行一次内存就增加一个图形变量的大小.到最后释放时只会释放栈中的最后一个.

Dim HImg As HObject = Nothing

HOperatorSet.GenEmptyObj(HImg)

HImg.Dispose()

HOperatorSet.ReadImage(HImg, "c:/222.bmp")

While 1

'输入与输出同一变量,不断叠加使用

HOperatorSet.CropDomain(HImg, HImg)

End While

'最后释放只会释放一次。即队列中的最后一个。

HImg.Dispose()

End Sub

正确处理方法:

没处理一次就释放一次,若想使得处理前与处理后的结果都放在同一变量下,可以增加一个中间变量,这个中间变量也是用一次就释放一次.

Dim HImg As HObject = Nothing

HOperatorSet.GenEmptyObj(HImg)

HImg.Dispose()

HOperatorSet.ReadImage(HImg, "c:/222.bmp")

Dim TempObject As HObject = Nothing

While 1

'拷贝到中间变量上

HOperatorSet.CopyObj(HImg, TempObject, 1, -1)

'原变量马上释放掉

HImg.Dispose()

'用中间变量进行处理,处理结果放在原变量上

HOperatorSet.CropDomain(TempObject, HImg)

'中间变量马上释放掉

TempObject.Dispose()

End While

 

'最后把所有图形变量都释放掉

HImg.Dispose()

TempObject.Dispose()

二、变量定义技巧

像这样调用

Dim CurBmp As Bitmap = Nothing

Dim CurHobject As HObject

CurBmp = FrmImagingCameTool.SnapNetImg(CameraT)

CurHobject = ImageCoverTool.SwitchHalconImage(CurBmp)

也会使内存急剧上涨。所以把变量定义改成一下格式,每次对变量赋值都会释放一次变量数据。

Private mCurBmp As Bitmap

Public Property CurBmp() As Bitmap

Get

Return mCurBmp

End Get

Set(ByVal value As Bitmap)

If mCurBmp IsNot Nothing Then

mCurBmp.Dispose()

End If

mCurBmp = value

End Set

End Property

 

Private mCurHobject As HObject

Public Property CurHobject() As HObject

Get

Return mCurHobject

End Get

Set(ByVal value As HObject)

If mCurHobject IsNot Nothing Then

CurHobject.Dispose()

End If

mCurHobject = value

End Set

End Property

 

 

posted @ 2022-06-05 23:45  ihh2021  阅读(1433)  评论(0编辑  收藏  举报