2010-02-18 8 views
3

MFC 문서 /보기 C++ 그래픽 응용 프로그램을 사용하여 모든 드로잉을 화면 비 트맵으로 처리 한 다음 OnDraw 메서드에서 제공된 CDC 포인터로 복사합니다. 지난 며칠 동안 나는 별도의 작업자 스레드에 드로잉 구성 요소를 배치하려고 했으므로 GUI가 스톨되지 않습니다. 나는이 일을 할 때 상당한 양의 MFC GDI 관련 주장을 발동하는 것 같다.MFC의 비트 맵에 배경 드로잉을위한 스레드 유형

VERIFY(::MoveToEx(m_hAttribDC, x, y, &point) 

그래서 몇 가지 질문;

  • MFC & GDI에서 작업 스레드를 사용하는 데 문제가 있습니까?
  • 스레드에서 MFC GDI 개체를 사용하는 데 문제가 있습니까?
  • GDI 개체를 스레드에 로컬로 선언해야합니까?

리소스/잠금 관련 문제 일 수 있지만 그리기 스레드는 모든 도면에 사용되는 자체 증명 CDC 및 CBitmap을 가지고 있으며 hasz excludive 일 때 비트 맵을 주 스레드로 다시 복사합니다 뮤텍스를 통한 액세스. 이 코드는 문제가 스레딩과 관련되어 있음을 증명하기 위해 별도의 스레드가 아닌 직접 호출을 통해 테스트되었습니다.

답변

2

장치 컨텍스트는 모든 스레드에서 사용할 수 있습니다 (GetDC을 수행 한 스레드는 ReleaseDC도 호출해야 함). 그러나 본질적으로 스레드로부터 안전하지는 않습니다. 특정 시점에 한 명의 발신자 만 DC에 액세스하는지 확인해야하지만, 작성자가 작성한 내용부터 처리해야합니다.

무엇을 의미합니까? GDI 스레드를 스레드에 로컬로 선언해야합니까?? 동일한 스레드에서 할당되고 해제되어야하지만 모든 스레드에서 작성/사용될 수 있습니다. 다시 한번, 두 개의 스레드에서 같은 자원을 동시에 사용하지 않아도됩니다.

당신은 아마 주제에 레이몬드 첸 게시물의 시리즈를 확인해야합니다 :

및 C/MFC 라이브러리의 단일 스레드 버전에 연결하지 않았는지 확인하십시오.

+0

링크를 주셔서 감사합니다, 두 번째 장치 컨텍스트에서 다른 스레드에서 DC 선택 및 해제 허용되지 않습니다 내 질문을 정렬했습니다. –

1

레이몬드 첸은 자신의 블로그에 이것에 대해 게시했습니다

http://blogs.msdn.com/oldnewthing/archive/2005/10/11/479587.aspx

는 (당신에게 도움이 될 수있는 윈도우 객체의 스레드 선호도에 대한 다른 블로그 게시물이 있습니다).

분명히 DC의 경우 동일한 스레드에서 Get/Release를 수행해야합니다.

희망 하시겠습니까?

+0

감사합니다. 올바른 대답입니다.미안 피카소는 머리카락 한 덩어리로 먼저 도착했습니다. –

+0

@Shane : 당신이 틱하는 한 걱정할 필요가 없습니다! –

관련 문제