안녕하세요 버튼을 누를 때마다 세 개의 다른 IP 카메라에서 이미지를 저장해야하는 애플리케이션이 있습니다.wpf에서 리소스를 올바르게 처리하는 방법
저는 IP 카메라에서 이미지를 저장하는 데 필요한 모든 멤버, 즉 사진이 저장된 BitmapImage와 DateTime을 가진 클래스를 사용하고 있습니다.
다음과 같은 문제가 있습니다. 몇 백 밀리 초마다 각 카메라의 사진을 일정량 저장해야합니다. 그리고 나는 현재 각각의 카메라의 50 장의 사진을 200ms마다 ConcurrentQueue에 저장하여 테스트하고 있으며, 그 다음에 항목들은 ConcurrentQueue에서 파일로 저장됩니다. 세 카메라 모두 약 110 장의 사진을 찍은 후에는 그냥 빈 이미지 만 저장합니다.
내 문제는 프로그램 메모리가 너무 꽉 차서 ConcurrentQueue의 TryDequeue() 메서드로 항목을 저장할 때 메모리에서 항목을 지울 필요가 있다고 생각합니다.
아무도 나에게 조언을하거나 내가 각 카메라에 원하는만큼 많은 사진을 저장할 수 있고 특정 후 메모리가 부족하지 않도록이 문제를 저장하는 데 도움이되는 링크를 제공 할 수 있습니까? 금액 사진?
버튼을 누른 후 for 루프로 이동하여 다음 메소드를 호출합니다.
private void EnqueuePhotos1()
{
IPCamera1 ipCam1Enqueue = new IPCamera1();
BitmapImage cam1Image = new BitmapImage();
cam1Image.BeginInit();
cam1Image.CacheOption = BitmapCacheOption.OnLoad;
cam1Image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
cam1Image.UriSource = null;
cam1Image.UriSource = new Uri("http://" + ipCam1IP + "/image?res=full&x0=0&y0=0&x1=1600&y1=1200&quality=21&doublescan=0", UriKind.Absolute);
while (cam1Image.IsDownloading) { ; }
cam1Image.EndInit();
ipCam1Enqueue.IPCamImage = cam1Image;
ipCam1Enqueue.TimeTook = DateTime.Now;
ipCam1ConQ.Enqueue(ipCam1Enqueue);
}
사용자가 찍고 싶은 사진의 수에 따라 일정한 시간 동안.
for 루프 전에 ConcurrentQueue에 무언가가있을 경우 매 100ms마다 타이머를 시작한 다음 무언가가 발견되면 다음 기능을 호출합니다. 이런 방식으로 정의
private void GetPhotos1()
{
IPCamera1 ipCam1Dequeue = new IPCamera1();
while (ipCam1ConQ.TryDequeue(out ipCam1Dequeue))
{
cam1Photos++;
cam1ImgLoc = cam1Location + "\\Image " + cam1Photos + ".jpg";
FileStream cam1Stream = new FileStream(cam1ImgLoc, FileMode.Create);
JpegBitmapEncoder cam1Encoder = new JpegBitmapEncoder();
cam1Encoder.Frames.Add(BitmapFrame.Create(ipCam1Dequeue.IPCamImage));
cam1Encoder.Save(cam1Stream);
cam1Stream.Dispose();
}
}
"내 문제는 프로그램 메모리가 너무 꽉 찼다 고 생각합니다."=> 왜? – Jon
큰 개체 힙 조각화 문제가 없는지 확인할 수도 있습니다. 이는 메모리에 사진을 보관하는 경우 일 수 있습니다. https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ – polkduran
응용 프로그램의 작동 방식을 모른 채 질문에 답변 할 수있는 사람은 어떻게해야합니까? (라이프 사이클 관리)? 일반적으로 잠재적 인 메모리 누수가있는 곳에서 아이디어를 얻기 위해 애플리케이션을 프로파일 링 할 수 있습니다. [.NET Memory Profiler] (http://memprofiler.com/)는 IMHO가이 작업을위한 훌륭한 도구입니다. – DHN