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

来源:互联网 发布:java软件工程简历模板 编辑:程序博客网 时间:2024/05/16 17:49


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


原创粉丝点击