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


用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句柄数量不再随时间增加。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值