2017-11-12 31 views
-1

를 얻기 위해 스레드 내 개체를 처리 :당신이 볼 수있는 작업자 스레드에서 RTSP 비디오 스트림을 표시 Accord.Net을 사용하고 효율적인 메모리 사용을

Main_Form :

 VideoFileReader reader = new VideoFileReader(); 
    Thread Proceso1; 
    Proceso1 = new Thread(new ThreadStart(updateui)); 
    Proceso1.Start(); 

그리고 내 기능 :

public void updateui() 
     { 
       reader.Open(RTSPAddress); 

       while (true) 
       { 
        Bitmap frame1 = reader.ReadVideoFrame(); 

        pictureRTSP.BackgroundImage = frame1; 
       } 
     } 

그것은 몇 초 동안 잘 작동하지만 난 스레드에서 모든 개체를 처리하는 방법을 알고 싶어 낭포 그 후 난 메모리 예외 나가?

+0

'frame1'과 같이'frame1'을 삭제하고'reader.Close()'와 같이'reader'도 닫으십시오. – Aria

+0

@Aria picturebox는 어떻습니까? –

+0

@Aria 어디에서 독자를 닫아야합니까? –

답변

3

루프마다 while 루프를 반복 할 때마다 새로운 비트 맵이 생성되지만 명시 적으로 삭제되지는 않습니다. 당신은 디스플레이 프레임을 읽고 업데이트 할 때마다, 당신은 이전 프레임을 처리해야이 도움이 될

public void UpdateUI() // C# naming conventions 
{ 
    reader.Open(RTSPAddress); 
    while (true) 
    { 
     Bitmap previousFrame = pictureRTSP.BackgroundImage; 
     Bitmap currentFrame = reader.ReadVideoFrame(); 
     pictureRTSP.BackgroundImage = currentFrame; 
     if (previousFrame != null) 
      previousFrame.Dispose(); 
    } 
} 

하지만 해결해야 할 다른 문제가 여전히있다 :

  • 다음 프레임을 읽는 동안 예외가 발생하면 어떻게됩니까?
  • 비디오 스트림의 끝에 도달하면 어떻게됩니까?
  • 위의 코드가 동영상의 프레임 속도보다 빠르게 실행되면 어떻게됩니까?
+0

감사하지만이 줄에서. Bitmap previousFrame = pictureRTSP.BackgroundImage; 이 오류가 나타납니다. 암시 적으로 'System.Drawing.Image'형식을 'System.Drawing.Bitmap'형식으로 변환 할 수 없습니다. 명시 적 변환이 존재합니다 (캐스트가 누락 되었습니까?) –

+0

다음과 같이 변경할 수 있습니까? Bitmap previousFrame = (Bitmap) pictureRTSP.BackgroundImage; –

+0

위의 줄을 다음과 같이 바꿀 수 있습니다 :'var previousFrame = pictureRTSP.BackgroundImage;' –