2015-01-07 5 views
-1

카메라에서 비트 맵 이미지를 가져와 블록에서로드 및 수집을 차단하는 프로그램이 있습니다. UI 스레드에서 SetImage를 호출합니다. 몇 초 동안 작동 한 다음 메모리 부족 예외가 발생합니다. 당신이 관리되는 리소스를 포함로 코드에서 비트 맵 오브젝트를 처리 할 필요가BlockingCollection 메모리 부족 예외

Class MyThread 
{ 
    BlockingCollection<Bitmap> q = new BlockingCollection<Bitmap>(); 

    Thread thread; 

    public MyThread() 
    { 

    thread = new Thread(ThreadFunc); 
    thread.Start(); 
    } 

    void ThreadFunc() 
    { 
    Bitmap local_bitmap = null; 

    while (!exit_flag) 
    { 
     // This blocks until an item appears in the queue. 
     local_bitmap = q.Take(); 

     // process local_bitmap 
    } 
    } 

    public void SetImage(Bitmap bm) 
    { 
     q.Add(bm); 
    } 
} 
+1

검색을 사용하여 비트 맵을 처리하십시오. – CodeCaster

+0

비트 맵을 처리하는 것을 잊어 버리는 것 외에, 카메라가 처리 할 수있는 것보다 빠르게 비트 맵을 뱉어 내면 항상이 예외가 발생합니다. 가능성이 큰 사고입니다. BlockingCollection의 요점은 그것이 가득 차게되면 차단하도록하는 것입니다. * int *를 취하는 생성자를 사용하십시오. –

+0

입력 해 주셔서 감사합니다. @HansPassant 이것은 내 카메라가 내가 처리 할 수있는 것보다 더 빨리 이미지를 제공한다는 것과 정확하게 일치합니다. 제한된 컬렉션을 사용하도록 제안 하시겠습니까? – Zshan

답변

1

알려 주시기 바랍니다, 스레드 FUNC은 다음과 같아야합니다

void ThreadFunc() 
    { 


    while (!exit_flag) 
    { 
     // This blocks until an item appears in the queue. 
     using (Bitmap local_bitmap = q.Take()) 
     { 

     // process local_bitmap 
     } 
    } 
    } 

GC가 자동으로 메모리를 관리하도록 설계되어 있지만 같은 경우에 스케줄 GC에서 런타임은 관리되지 않는 메모리 사용이 아니라 관리 메모리가 할당되는 양을 고려합니다. 따라서이 경우 개체를 직접 처리하거나 GC.AddMemoryPressure를 호출하여 GC 속도를 높여야합니다.