您的位置:首页 > 其它

《Windows程序设计-第二版》第四章最后一个04Clock大例子中的GDI句柄泄漏问题

2013-01-28 10:22 363 查看


用Sysinternals工具里的process explorer监控发现 GDI Handles在不断增加,大概是每秒增加2个。

检查原书代码:

case WM_TIMER:
{
// Èç¹û´°¿Ú´¦ÓÚ×îС»¯×´Ì¬¾ÍʲôҲ²»×ö
if(::IsIconic(hWnd))	// IsIconicº¯ÊýÓÃÀ´Åжϴ°¿ÚÊÇ·ñ´¦ÓÚ×îС»¯×´Ì¬
return 0;

// È¡µÃϵͳʱ¼ä
SYSTEMTIME time;
::GetLocalTime(&time);

// ½¨Á¢×ø±êϵ
HDC hdc = ::GetDC(hWnd);
SetIsotropic(hdc, s_cxClient, s_cyClient);

// ÒÔCOLOR_3DFACEΪ±³¾°É«¾Í¿ÉÒÔ²Á³ýÖ¸ÕëÁË£¨ÒòΪ´°¿ÚµÄ±³¾°É«Ò²ÊÇCOLOR_3DFACE£©
COLORREF crfColor = ::GetSysColor(COLOR_3DFACE);

// Èç¹û·ÖÖӸıäµÄ»°¾Í²Á³ýʱÕëºÍ·ÖÕë
if(time.wMinute != s_nPreMinute)
{
// ²Á³ýʱÕëºÍ·ÖÕë
DrawHand(hdc, 200, 8, s_nPreHour*30 + s_nPreMinute/2, crfColor);
DrawHand(hdc, 400, 6, s_nPreMinute*6, crfColor);
s_nPreHour = time.wHour;
s_nPreMinute = time.wMinute;
}

// Èç¹ûÃë¸Ä±äµÄ»°¾Í²Á³ýÃëÕ룬ȻºóÖØ»­ËùÓÐÖ¸Õë
if(time.wSecond != s_nPreSecond)
{
// ²Á³ýÃëÕë
DrawHand(hdc, 400, 1, s_nPreSecond*6, crfColor);

// ÖØ»­ËùÓÐÖ¸Õë
DrawHand(hdc, 400, 1, time.wSecond*6, RGB(0, 0, 0));
DrawHand(hdc, 200, 8, time.wHour*30 + time.wMinute/2, RGB(0, 0, 0));
DrawHand(hdc, 400, 6, time.wMinute*6, RGB(0, 0, 0));
s_nPreSecond = time.wSecond;
}
return 0;
}


发现
case WM_TIMER:


消息处理中在取得HDC使用完毕后没有释放DC句柄,需要在

return 0;


语句之前添加释放hdc语句:

::ReleaseDC (hWnd, hdc);


Build后用Process Explorer再次检查发现GDI句柄数量不再随时间增加。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: