2016-08-24 2 views
0

에서 이미지를 읽을 수있는 적절한 방법 :내부의 데이터 처리와 <code>Thread</code> 실행 내가 클래스를 가지고 다른 스레드

void thread_function() 
{ 
    while (client != null) 
    { 
    ....some stuff... 
    wrBitmap.WritePixels(rect, rgbch, rowLen, 0); // wrBitmap is WriteableBitmap 
    OnFrameRdy(this, MyEventsArgs); 
    } 
} 

어떻게 메모리 복사하지 않고이 Thread 과정에서 wrBitmap를 읽을 수 있습니까? 내 Image wpf 컨트롤에 wrBitmap을 바인딩해야합니다. 그게 가능하니?

또는 그것을 수행하는 유일한 방법은 클래스의 다른 변수에 대해 wrBitmap을 복사하여 내 컨트롤에서 읽는 것입니까? 변수를 복사하고 싶지 않아 메모리에 엄청난 오버 헤드가 발생합니다.

이벤트를 사용할 수 있다고 생각하고 내 OnFrameRdy 이벤트를 만들었지 만 여전히 데이터를 사용하지는 않습니다. 난 그냥 당신이 다른 스레드에서 Source 속성을 설정하려고 시도에서 InvalidOperationException를 얻거나 (당신이 심각이어야 만들어 다른 스레드에서 Bitmap를 사용하고 내가 을 추측하고 Image.source = MyClass.wrBitmap

+0

"데이터를 사용하지 못하게하는 것"은 무엇을 의미합니까? 여기 당신 문제는 뭐니? 왜 당신은 스레드에서'Image.source = MyClass.wrBitmap'을 할 수 없습니까? – slawekwin

+0

WritePixels을 Image 컨트롤에 할당 한 후에 수정하려고하십니까? – Clemens

+0

'Image.source = MyClass.wrBitmap'을 쓸 때'InvalidOperationException' 예외가 발생합니다. wrBitmap이 다른'Thread'에서 생성 되었기 때문입니다. 그리고 wrBitmap 데이터를 메모리 오버 헤드없이 Image 컨트롤로 전송하는 방법을 모른다. – Aleksey

답변

0

를 입력 할 수 있다면 정말 멋진 것 당신이 해결하려고하는 이슈에 대해 더 명백하게).

맞으면 비트 맵 Freeze (변경 불가)을 UI 스레드에서 Image.Source으로 지정해야합니다. 이것은 당신을 위해 작동해야합니다 :

void thread_function() 
{ 
    while (client != null) 
    { 
     ....some stuff... 
     wrBitmap.WritePixels(rect, rgbch, rowLen, 0); // wrBitmap is WriteableBitmap 
     wrBitmap.Freeze(); 
     Dispatcher.BeginInvoke((Action)(() => Image.Source = wrBitmap)); 
    } 
} 
+0

네, 맞습니다.'InvalidOperationException'은 제 문제입니다. 왜냐하면 다른 스레드에서'Source' 속성과'Bitmap'을 연결하려고하기 때문입니다. 'Freeze'와'Dispatcher'는 잘 동작하지만,'wrBitmap'을 주기적으로 사용하고 싶습니다.'Freeze'는 제가 그렇게하지 못하게합니다. 사이클에서 동일한'wrBitmap'을 사용하고 그것이 완료 될 때만'source'로 제공 할 수있는 방법이 있습니까? – Aleksey

+0

"주기적으로'wrBitmap'을 사용하는 것이 무슨 뜻인지 이해할 수 없네요. 가능하면 질문에 대한 편집으로이 내용을 자세히 설명하십시오. 점진적으로 이미지를 빌드하고 각 반복 후에 결과를 표시하려면 중간 이미지를 복사하지 않고 이미지를 수행 할 수 있다고 생각하지 않습니다. – slawekwin

관련 문제