2013-06-05 2 views
0

안녕하세요 버튼을 누를 때마다 세 개의 다른 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(); 
     } 
    } 
+1

"내 문제는 프로그램 메모리가 너무 꽉 찼다 고 생각합니다."=> 왜? – Jon

+0

큰 개체 힙 조각화 문제가 없는지 확인할 수도 있습니다. 이는 메모리에 사진을 보관하는 경우 일 수 있습니다. https://www.simple-talk.com/dotnet/.net-framework/the-dangers-of-the-large-object-heap/ – polkduran

+1

응용 프로그램의 작동 방식을 모른 채 질문에 답변 할 수있는 사람은 어떻게해야합니까? (라이프 사이클 관리)? 일반적으로 잠재적 인 메모리 누수가있는 곳에서 아이디어를 얻기 위해 애플리케이션을 프로파일 링 할 수 있습니다. [.NET Memory Profiler] (http://memprofiler.com/)는 IMHO가이 작업을위한 훌륭한 도구입니다. – DHN

답변

1
using (FileStream cam1Stream = new FileStream(cam1ImgLoc, FileMode.Create)) 
{ 
    // do stuff... 
} 

자원은 자동적으로 실행되는 사용하여 문에서 문 다음에 배치된다.

관련 문제