Как справиться с утечкой ресурсов GDI - PullRequest
0 голосов
/ 07 ноября 2011

В моем приложении я получаю DC, используя GetDC, и также освобождаю этот DC, используя ReleaseDC.

Но когда я профилирую свое приложение с помощью VTune, он показывает GDIResource Leak в GetDC.

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 id, глобально определенный как 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);
}

Пожалуйста, помогите мне решить эту проблему.

1 Ответ

0 голосов
/ 09 ноября 2011

Несмотря на то, что используется переменная-член m_hdc и не используется локальная переменная, этот код сам по себе выглядит неплохо.

Видите ли вы маркировку VTune, которая течет каждый раз или только иногда?

Когда я вижуВаш вызов IsWindow () и имя переменной g_threadMarkedForStop Интересно, если вы делаете многопоточность.Может быть, вы иногда разрушаете окно, находясь между GetDC и ReleaseDC?

...