新位图上的内存不足异常

时间:2016-08-07 13:19:21

标签: .net vb.net resources

在我自己的应用程序中,我运行了一个"更新"在计时器已过去的事件中每5秒运行一次。 此功能每5秒触发一次,用可变状态更新45个图片框图像" ... StatoBrucitore"。我也可以通过界面上的重绘按钮强制执行此功能;在压力测试中,当我多次点击此功能时,我注意到了#34;内存异常"。 这是代码:

Select Case Essiccatoio.RegTemp(Ireg).StatoBruciatore
    Case eStato.sOFF
        NomeFile = Trim("FlameOff.png")
        NomeFile = Percorso & "\Immagini\" & NomeFile
        If My.Computer.FileSystem.FileExists(NomeFile) Then
            Dim bm As New Bitmap(NomeFile)
            PictBruc(Ireg).BackgroundImage = bm
            PictBruc(Ireg).Image = Nothing
        End If
    Case eStato.sAccensione
        NomeFile = Trim("FlameTransitorio.gif")
        NomeFile = Percorso & "\Immagini\" & NomeFile
        If My.Computer.FileSystem.FileExists(NomeFile) Then
            Dim bm As New Bitmap(NomeFile)
            PictBruc(Ireg).BackgroundImage = Nothing
            PictBruc(Ireg).Image = bm
        End If
    Case eStato.sRegime
        NomeFile = Trim("FlameTransitorio.png")
        NomeFile = Percorso & "\Immagini\" & NomeFile
        If My.Computer.FileSystem.FileExists(NomeFile) Then
            Dim bm As New Bitmap(NomeFile)
            PictBruc(Ireg).BackgroundImage = bm
            PictBruc(Ireg).Image = Nothing
        End If
End Select

请注意中间情况" eStato.sAccensione"是一个动画GIF,所以我不能使用listimage而不是这种方法,因为我可能会丢失动画。 我认为问题是连续的新位图" ... 任何人都有建议的选项来解决此异常?

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您正在使用以下行创建 new 位图:

Bitmap

...但你没有丢弃任何以前的图像。在45秒对象的5秒计时器上执行此操作意味着每分钟许多新对象。最终你将无法再创建并获得错误。

由于您要分配相同的三个图像之一,因此没有理由一遍又一遍地重新创建这些位图。更重要的是,对于12个显示相同图像的图片框,您不需要12个不同的Private BurnerImgs(2) As Image ' load the array somewhere like form load: BurnerImgs(0) = Image.FromFile("...") BurnerImgs(1) = Image.FromFile("...") BurnerImgs(2) = Image.FromFile("...") 个对象。

在程序开头的某处将图像加载到一个数组中:

PictBruc(Ireg).Image = BurnerImgs(0)

然后从那里分配给定的图片框:

GetObject()

如果图像是资源的成员,那么你想要做同样的事情。用于从资源获取图像的My.Resources方法会创建一个新的图像对象。因此,重复分配资源可能会导致同样的问题。

Private BurnerImgs As Image() ... BurnerImgs = New Image() {My.Resources.FlameOn, My.Resources.FlameOff, My.Resources.WhiteHotFlame} 加载数组更容易:

name1=str(input("Enter name #1: "))
name2=str(input("Enter name #2: "))
name3=str(input("Enter name #3: "))

one = name1[0].upper() + name1[1].upper() + name1[2].upper()
two = name2[0].upper() + name2[1].upper() + name2[2].upper()
three = name3[0].upper() + name3[1].upper() + name3[2].upper()

if one < two and two < three:
     print("These names in alphabetical order are: ", name1, name2, name3)
elif one < two and three < two:
     print("These names in alphabetical order are: ", name1, name3, name2)     
elif two < three and three < one:
     print("These names in alphabetical order are: ", name2, name3, name1)
elif two < one and one < three:
     print("These names in alphabetical order are: ", name2, name1, name3)
elif three < two and two < one:
     print("These names in alphabetical order are: ", name3, name2, name1)
else:
     print("These names in alphabetical order are: ", name3, name1, name2)

答案 1 :(得分:0)

在为图片框指定新的位图之前,请务必在现有图片框上调用 Dispose()

If PictBruc(Ireg).Image isnot nothing then PictBruc(Ireg).Image.Dispose