2011-11-07 2 views
0

내 응용 프로그램에서 GetDC를 사용하여 DC를 받고 있는데 ReleaseDC를 사용하여 해당 DC를 릴리스하고 있습니다.GDI 리소스 누출 처리 방법

VTune으로 응용 프로그램을 프로파일 링 할 때 GetDC에서 GDIResource Leak가 표시됩니다.

다음

m_hdc = ::GetDC(hWndDisplay[frameIndex]); 
::SetStretchBltMode(m_hdc,STRETCH_DELETESCANS); 
::StretchDIBits(m_hdc,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,imageWidth,imageHeight,rgbavpg,pTempBmpInfo,DIB_RGB_COLORS,SRCCOPY); 
::ReleaseDC(hWndDisplay[frameIndex],m_hdc); 

관련 코드 : m_hDC 있습니다 이드 HDC의 m_hDC 있습니다 세계적으로 정의;

void Display(unsigned char *rgbavpg,unsigned long imageSize, unsigned int imageWidth, unsigned int imageHeight, unsigned int frameIndex) 
{ 

PBITMAPINFO pTempBmpInfo = NULL; 
DWORD timespan; 
int temp; 

if ((IMAGE_WIDTH==imageWidth)&&(IMAGE_HEIGHT==imageHeight)) 
{ 
    frameNum++ ; 
} 
timespan = 1000/15; 
DWORD diff = GetTickCount() - tickes[frameIndex];//lvm4; 
tickes[frameIndex]=GetTickCount(); 
if (g_threadMarkedForStop[frameIndex] == TRUE) 
{   
    return; 
} 
if(diff < timespan) 
    { 
      Sleep(diff); 
    } 
if (FALSE == ::IsWindow(hWndDisplay[frameIndex])) 
{ 
    g_threadMarkedForStop[frameIndex] = TRUE 
    return; 
} 

pTempBmpInfo = &m_bmpinfo[frameIndex]; 
if(pTempBmpInfo != NULL) 
{ 
    pTempBmpInfo->bmiHeader.biWidth= imageWidth ; 
    pTempBmpInfo->bmiHeader.biHeight= imageHeight; 
} 
else 
{ 
    g_threadMarkedForStop[frameIndex] = TRUE; 

    return; 
} 
m_hdc = ::GetDC(hWndDisplay[frameIndex]); 
    ::SetStretchBltMode(m_hdc,STRETCH_DELETESCANS); 

if (true == fullscreen)    ::StretchDIBits(m_hdc,0,0,510,320,0,0,imageWidth,imageHeight,rgbavpg,pTempBmpInfo,DIB_RGB_COLORS,SRCCOPY); 
else 
{  ::StretchDIBits(m_hdc,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,imageWidth,imageHeight,rgbavpg,pTempBmpInfo,DIB_RGB_COLORS,SRCCOPY); 
    //::SetDIBitsToDevice(m_hdc,0,0,IMAGE_WIDTH,IMAGE_HEIGHT,0,0,0,imageHeight,rgbavpg,pTempBmpInfo,DIB_RGB_COLORS); 
} 
::ReleaseDC(hWndDisplay[frameIndex],m_hdc); 
} 

이 문제를 해결하는 데 도움을주십시오.

+0

해당 스 니펫에는 명백한 누수가 없습니다. 왜 m_hdc가 당신 클래스의 멤버입니까? 그건 옳지 않아. –

+0

답장을 보내 주셔서 감사합니다. 음 m_hdc는 전 세계적으로 정의 된 HDC 유형의 핸들입니다. 왜 이것이 옳지 않다고 생각하는지 자세히 설명해 주시겠습니까? –

+0

나는 Hans의 요점은 dc가 더 이상 필요하지 않은 즉시 사용 및 폐기되어야한다는 것이 었습니다. 그것들은 메모리/리소스를 소비하고 있으며, 선택된 BMP는 삭제 될 수 없기 때문에 거짓말을하는 것은 일반적으로 잘못된 습관입니다. –

답변

0

멤버 변수 m_hdc를 사용하고 로컬 변수를 사용하지 않지만이 코드 자체만으로는 좋지 않습니다.

매번 누출되는 VTune 표시 또는 때때로 만 나타나는 VTune 표시를 보십니까?

IsWindow()와 변수 이름 g_threadMarkedForStop에 대한 호출을 볼 때 멀티 스레딩을하고 있는지 궁금합니다. GetDC와 ReleaseDC 사이에서 창을 가끔 파괴 할 수 있습니까?

+0

답장을 보내 주셔서 감사합니다 ... 실제로 내 응용 프로그램은 프레임별로 코덱을 통해 디코딩하여 하나 이상의 비디오 축소판을 표시합니다 .VTune은 하나의 비디오 축소판을 표시하는 누수가 없지만 하나 이상의 비디오 축소판은 GDIResource 누수가 m_hdc = :: GetDC (hWndDisplay [frameIndex]); ReleaseDC를 사용했다는 것을 알 수 있듯이 릴리스하고 있습니다. 예 하나 이상의 축소판을 표시하기 위해 다중 스레딩을 수행했습니다. 그리고 GetDC와 ReleaseDC 사이의 창을 파괴하지는 않습니다. DC를 해제 할 수있는 다른 방법이 있습니까? 곧 회신 해주십시오. Mayank –

+0

이 경우 1) m_hdc를 로컬 변수로 변경하여 m_hdc를 어디서나 변경하지 않고 2) Windows가 DC를 실제로 릴리스했는지 확인하기 위해 ReleaseDC의 반환 값을 확인하십시오. VTune이이 두 가지 변경 후에도 여전히 불만이있는 경우 VTune 오류 메시지를 무시할 수 있습니다. –

+0

고마워 베르너, 내 문제가 해결되었습니다. 이제 로컬로 m_hdc를 선언했으며 작동 중입니다.하지만 전 세계적으로 선언되었을 때 GDIResource 누수가 발생한 이유는 무엇입니까? 다시 한번 고마워요 .... –