在我的应用程序中,我使用GetDC获取DC,并且我还使用ReleaseDC释放该DC。如何处理GDI资源泄漏
但是,当我使用VTune分析我的应用程序时,它在GetDC上显示一个GDIResource泄漏。
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);
以下是相关的代码:全局定义为HDC m_hdc m_hdc ID;
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);
}
请帮我解决这个问题。
这段代码没有明显的泄漏。为什么m_hdc是你班级的成员?这是不对的。 –
感谢您的回复。 m_hdc是全局定义的HDC类型的句柄。你能否详细说明为什么你认为这是不对的? –
我假设汉斯的观点是,只要你不再需要他们,就应该使用和处置直流电。它们是内存/资源消耗的,被选入它们的bmp不能被删除,所以通常错误的做法是让它们躺在地上。 –