在我自己的应用程序中,我运行了一个"更新"在计时器已过去的事件中每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而不是这种方法,因为我可能会丢失动画。 我认为问题是连续的新位图" ... 任何人都有建议的选项来解决此异常?
感谢您的帮助
答案 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