《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句柄數量不再隨時間增加。


發佈了9 篇原創文章 · 獲贊 15 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章