我正在开发一个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 :(得分:1)
当运行时无法为您的对象分配内存时,抛出OutOfMemoryException,这是显而易见的。
确保您的Big物品不会长寿,并且您可以快速处理它们。
你的VideoFileWriter对象只要它们是队列中的项目就会存在,你如何初始化它并将它放在你的循环中以便它不会占用太多内存?
答案 1 :(得分:-1)
应该处理位图。你正在处理好的Graphics对象,但位图将占用大量内存,尤其是在循环/定时器事件中。然后尝试GC.Collect(),它将清除其他任何内容。