AForge,内存堆叠
AForge, memory stacking up
我正在尝试使用 C# 和 AForge 库获取框架:
...
using AForge.Video
using AForge.Video.DirectShow
namespace Example
{
class Program
{
private static Bitmap mySnap = null;
static void Main(string[] args)
{
snapByte();
}
private static void snapByte()
{
int Counter = 0;
FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.NewFrame += new NewFrameEventHandler(videoNewFrame);
videoSource.Start();
do
{
Thread.Sleep(500);
Counter++;
}
while (mySnap == null && Counter < 4);
if (videoSource.IsRunning)
{
videoSource.SignalToStop();
videoSource.WaitForStop();
videoSource = null;
}
MemoryStream myStream = new MemoryStream();
mySnap.Save(myStream, ImageFormat.Png);
byte[] snapByteLength = MyStream.ToArray();
int snapLength = snapByteLength.Length;
Console.WriteLine(snapLength);
Console.ReadLine();
myStream.Dispose();
mySnap = null;
snapByte();
}
}
private static void videoNewFrame(object sender, NewFrameEventArgs eventArgs)
{
mySnap = (Bitmap)eventArgs.Frame.Clone();
}
}
}
这正是我使用的代码,我只是更改了图像字节处理以显示字节长度以简化操作..
我遇到的问题是,每次拍摄快照时,内存都会保持在 1-2 mb 之间的任何位置。
我正在处理我的所有位图,除了我返回 null 的 mySnap。我不能处理 mySnap,因为它再次使用,我必须声明它是全局的,因为我在 snapByte() 和 newVideoFrame() 中使用它
但是因为我重用了 mySnap 我不明白为什么它会堆积起来..它应该每次都被覆盖..
我看过其他答案,但都与图片框有关,答案是在加载新图像之前清除图片框..
我相信我在这里通过再次调用 mySnap=null 来做同样的事情..
但内存仍在堆积...
谢谢..
您正在通过在 snapByte()
方法末尾无条件调用 snapByte()
创建无限递归。 这会创建一个循环,一旦您的堆栈用完 space,该循环最终会崩溃;每次您的方法调用自身时,您都在设置一个永远不会被清除的新堆栈帧,因为该方法永远不会 returns。这可能需要一段时间才能体现出来,因为 Thread.Sleep()
调用会使您的递归调用受到限制。
此外,任何在递归调用 snapByte() 之前未被清空的引用都将无限期地保留在内存中,因为这些引用在永远不会退出的范围内存在(因为无限递归) 并且永远不会被 GC 回收。
您的 videoDevices
集合就是这种情况,但更重要的是 snapByteLength
数组实例,它包含您刚刚捕获的位图的副本。我敢打赌这是你内存泄漏的主要原因
避免递归并将其转换为简单循环应该可以解决您的问题。
我正在尝试使用 C# 和 AForge 库获取框架:
...
using AForge.Video
using AForge.Video.DirectShow
namespace Example
{
class Program
{
private static Bitmap mySnap = null;
static void Main(string[] args)
{
snapByte();
}
private static void snapByte()
{
int Counter = 0;
FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString);
videoSource.NewFrame += new NewFrameEventHandler(videoNewFrame);
videoSource.Start();
do
{
Thread.Sleep(500);
Counter++;
}
while (mySnap == null && Counter < 4);
if (videoSource.IsRunning)
{
videoSource.SignalToStop();
videoSource.WaitForStop();
videoSource = null;
}
MemoryStream myStream = new MemoryStream();
mySnap.Save(myStream, ImageFormat.Png);
byte[] snapByteLength = MyStream.ToArray();
int snapLength = snapByteLength.Length;
Console.WriteLine(snapLength);
Console.ReadLine();
myStream.Dispose();
mySnap = null;
snapByte();
}
}
private static void videoNewFrame(object sender, NewFrameEventArgs eventArgs)
{
mySnap = (Bitmap)eventArgs.Frame.Clone();
}
}
}
这正是我使用的代码,我只是更改了图像字节处理以显示字节长度以简化操作..
我遇到的问题是,每次拍摄快照时,内存都会保持在 1-2 mb 之间的任何位置。 我正在处理我的所有位图,除了我返回 null 的 mySnap。我不能处理 mySnap,因为它再次使用,我必须声明它是全局的,因为我在 snapByte() 和 newVideoFrame() 中使用它 但是因为我重用了 mySnap 我不明白为什么它会堆积起来..它应该每次都被覆盖..
我看过其他答案,但都与图片框有关,答案是在加载新图像之前清除图片框.. 我相信我在这里通过再次调用 mySnap=null 来做同样的事情.. 但内存仍在堆积...
谢谢..
您正在通过在 snapByte()
方法末尾无条件调用 snapByte()
创建无限递归。 这会创建一个循环,一旦您的堆栈用完 space,该循环最终会崩溃;每次您的方法调用自身时,您都在设置一个永远不会被清除的新堆栈帧,因为该方法永远不会 returns。这可能需要一段时间才能体现出来,因为 Thread.Sleep()
调用会使您的递归调用受到限制。
此外,任何在递归调用 snapByte() 之前未被清空的引用都将无限期地保留在内存中,因为这些引用在永远不会退出的范围内存在(因为无限递归) 并且永远不会被 GC 回收。
您的 videoDevices
集合就是这种情况,但更重要的是 snapByteLength
数组实例,它包含您刚刚捕获的位图的副本。我敢打赌这是你内存泄漏的主要原因
避免递归并将其转换为简单循环应该可以解决您的问题。