2017-11-12 11 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.Dispose(); 'とし、' reader'も 'reader.Close()'と同様に閉じます。 – 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

ありがとうございます。しかし、この行にありますが、ビットマップpreviousFrame = pictureRTSP.BackgroundImage;私はこのエラーが表示されます:暗黙的に型 'System.Drawing.Image'を 'System.Drawing.Bitmap'に変換できません。明示的な変換が存在します(キャストがありませんか?) –

+0

これを次のように変更することができます:Bitmap previousFrame =(Bitmap)pictureRTSP.BackgroundImage; –

+0

する必要はありませんが、上記の行を次のように変更することができます: 'var previousFrame = pictureRTSP.BackgroundImage;' –

関連する問題