【发布时间】:2011-12-23 14:59:28
【问题描述】:
在我的应用程序中,我使用 GetDC 获取 DC,并且还使用 ReleaseDC 释放该 DC。
但是当我使用 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);
以下是相关代码: 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);
}
请帮我解决这个问题。
【问题讨论】:
-
sn-p 中没有明显的泄漏。为什么 m_hdc 是您班级的成员?这不可能。
-
感谢您的回复。那么 m_hdc 是全局定义的 HDC 类型的句柄。您能否详细说明为什么您认为这不正确?
-
我假设 Hans 的观点是,一旦您不再需要 DC,就应该使用和处理掉它们。它们是内存/资源消耗的,选择到它们中的 bmp 不能被删除,所以让它们到处乱放通常是错误的做法。
标签: visual-c++ gdi