天天看點

GetTickCount()函數的陷阱!

開發中經經常使用GetTickCount()函數來進行間隔時間的推斷。如推斷某一段代碼運作花了多少時間等,使用比較友善。

可是僅僅針對尋常的一些測試。近期開發一個服務程式時,也在代碼中用GetTickCount()來進行推斷,大體格式例如以下:

DWORD dwBegin = 0;

void Thread_Run(void)
{	
	while(TRUE)
	{
		DWORD dwNow = GetTickCount();
		if (dwNow - dwBegin > 30) //second
		{
			....//
			dwBegin = dwNow;
		}
	}
}      

問題來了,GetTickCount()傳回的是DWORD類型,傳回的值代表程式從啟動到如今走過的時間。

DWORD類型的最大值為4294967295,折算成天是49.7。也就是說當服務程式連續跑了50天之後,再調用GetTickCount()的時候就會發生溢出。是以服務程式盡量不要用GetTickCount()。

假設要推斷間隔時間能夠用1970年以來的秒數差來計算。

繼續閱讀