我正在開發一個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
。
我認爲我在處理線程中使用的對象時出錯了。
有人可以幫我找到這些錯誤嗎?
可以在2秒鐘內將多少物品添加到隊列中,當它處於空閒狀態時您可以進入睡眠狀態? (我認爲你應該使用'BlockingCollection'而不是一個隊列...) –
在2秒鐘內完成20項。因爲我收到了三幀以上的一幀。我正在使用'ConcurrentQueue' –
GVillani82