2016-08-07 3 views
0

내 응용 프로그램에서 나는 타이머 경과 이벤트에 5 초마다 "업데이트"기능을 실행합니다. 이 함수는 5 초마다 실행되어 45 개의 picturebox 이미지를 "StatoBrucitore"변수 상태로 업데이트합니다. 인터페이스의 다시 그리기 버튼을 사용하여이 기능을 강제 실행할 수도 있습니다. 스트레스 테스트에서이 함수를 여러 번 클릭하면 "메모리 부족 예외"가 나타났습니다. 다음은 코드입니다 : 중간 경우 "eStato.sAccensione"는 애니메이션 GIF 것을메모리 부족 예외 새 비트 맵

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 

주, 그래서 내가 애니메이션을 손실 할 수 이러한 접근 방식 원인 대신 listimage을 사용할 수 없습니다. 나는이 문제가 계속되는 "새로운 비트 맵"이라고 생각한다 ... 누구나이 예외를 해결하기 위해 제안 된 옵션을 가지고 있는가?

도움

당신은 선이있는 새로운 비트 맵을 만드는
+1

'PictBruc()'란 무엇입니까? 당신이 만든 비트 맵을 처분하는 것처럼 보이지 않습니다. TaskManager – Plutonix

+0

에서 GDI 객체의 상승과 상승을 볼 수 있습니다 (Disposable 객체를 아무 것도 설정하지 않으면'Image' 속성에서 'BackgroundImage'에 할당 된 비트 맵에 영향을주지 않습니다.) 나는 꽤 확신합니다. 코드 유출), – Plutonix

+0

PictBruc()는 picturebox 배열입니다. 이 그림 상자는 항상 기본 양식에서 볼 수 있습니다. –

답변

1

주셔서 감사합니다 :

Dim bm As New Bitmap(NomeFile) 

...하지만 당신은 이전의 이미지를 폐기되지 않습니다. 45 개의 객체에 대해 5 초 타이머를 사용하면 분당 개의 새 객체가 개 있습니다. 결국에는 더 이상 생성 할 수 없으며 오류가 발생합니다.


동일한 세 이미지 중 하나를 지정했기 때문에 이러한 비트 맵을 계속해서 다시 만들 이유가 없습니다. 더 근본적으로 12 개의 그림 상자가 같은 이미지를 표시하려면 12 개의 다른 Bitmap 개체가 필요하지 않습니다.

로드 어딘가에 프로그램의 시작 배열로 이미지 :

Private BurnerImgs(2) As Image 

' load the array somewhere like form load: 
BurnerImgs(0) = Image.FromFile("...") 
BurnerImgs(1) = Image.FromFile("...") 
BurnerImgs(2) = Image.FromFile("...") 

그런 다음 거기에서 주어진에 PictureBox를 할당 :

PictBruc(Ireg).Image = BurnerImgs(0) 

을 이미지 자원의 구성원 인 경우 , 당신도 똑같은 일을하고 싶습니다. 리소스에서 이미지를 가져 오는 데 사용되는 GetObject() 메서드는 새 이미지 객체를 만듭니다. 따라서 리소스에서 반복적으로 할당하면 동일한 문제가 발생할 수 있습니다.

그것 좀 더 쉽게하지만 에서 배열을로드 :

Private BurnerImgs As Image() 
... 
BurnerImgs = New Image() {My.Resources.FlameOn, 
          My.Resources.FlameOff, 
          My.Resources.WhiteHotFlame} 
+0

GDI 번호에 누수가있는 경우 작업 관리자에서 확인했습니다. 없기. gdis의 수는 상수입니다. 내가 주목 한 예외는 메모리가 충분하지 않다는 것을 의미하며 디버그 모드에서는 행 레이블 "new"비트 맵에서 발생했습니다. 기억이있는 또 다른 문제가 있습니까? 아니면 내가 옳은 길을 찾고 있습니까? –

+0

종종 그 오류로 "메모리"라는 용어는 느슨하게 사용되고 실제로 자원이 부족하다는 것을 의미 할 수 있습니다. 새로운 비트 마를 만들 수는 없으므로 그렇게 될 것입니다. VS에는 이러한 도구를 찾는 데 도움이되는 분석 및 프로파일 러 도구가 있습니다. 그들은 때때로 당신이 선물하는 것보다 덜 obview입니다. – Plutonix

+0

나는이 후자의 대답을 이해하지 못한다. 메모리 부족 예외가 실제로이 "새 비트 맵"명령에서 발생합니까? –

0

당신의 그림 상자에 새 비트 맵을 할당하기 전에 당신이 기존에 폐기()를 호출해야합니다.

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