2013-06-19 92 views
0

我正在開發一個C#應用程序,它獲取來自設備(Kinect)的流。在線程中處理對象

由於幀速率對於我的CPU來說太高,我嘗試過使用線程。這似乎解決了我的問題。每次接收到一個新幀時,我都會放入一個隊列,然後另一個線程執行一次出隊並將幀寫入文件。

線程的代碼如下:

private void myThread() 
{ 
    writer1 = new VideoFileWriter(); 
    writer1.Open(outputFile1, 320, 240, 10, VideoCodec.WMV2); 

    while (!queue.IsEmpty || !streamClosed) 
    { 
     ColorImageFrame item = null; 

     if (!queue.IsEmpty && queue.TryDequeue(out item)) 
     { 
      if (item != null) 
      { 
       Bitmap result = new Bitmap(320, 240); 
       using (Graphics g = Graphics.FromImage(result)) 
       { 
        g.DrawImage(ImageToBitmap(item), 0, 0, 320, 240); 
        writer1.WriteVideoFrame(result); 
       } 
      } 
      Console.WriteLine("Queue size: "+queue.Count); 
     } 

     try 
     { 
      item.Dispose(); 
     } 
     catch (NullReferenceException ex) 
     { 
      Console.WriteLine(ex.Message); 
     } 

     if (queue.IsEmpty) 
     { 
      System.Threading.Thread.Sleep(2000); 
     } 
    } 

    writer1.Close(); 
    Environment.Exit(0); 
} 

這似乎是工作很好,但有時我收到OutOfMemoryException

我認爲我在處理線程中使用的對象時出錯了。

有人可以幫我找到這些錯誤嗎?

+0

可以在2秒鐘內將多少物品添加到隊列中,當它處於空閒狀態時您可以進入睡眠狀態? (我認爲你應該使用'BlockingCollection'而不是一個隊列...) –

+0

在2秒鐘內完成20項。因爲我收到了三幀以上的一幀。我正在使用'ConcurrentQueue ' – GVillani82

回答

1

那麼當運行時不能爲你的對象分配內存的時候會引發OutOfMemoryException,這很明顯。

確保您的大對象不會長壽,並且您可以快速處理它們。

你是VideoFileWriter對象只要它們是隊列中的項目就存在,你如何初始化它並將其放置在你的循環中,這樣它不會佔用太多內存?

-1

位圖應該丟棄。你正在處理好的圖形對象,但是位圖會佔用很多內存,特別是在循環/定時器事件中。然後嘗試GC.Collect(),它會清除其他任何東西。

+1

一次性對象的全部重點在於它們持有垃圾收集器*無法處理的內存。 – Servy