1. 程式人生 > >GetTickCount引起的一個詭異bug

GetTickCount引起的一個詭異bug

       話說有日公司一臺伺服器上執行的系統的一個功能突然不work了,而同樣的程式在別的伺服器都非常正常,無論如何重啟這個程式都不管用。在本地除錯,這個方法一點問題都沒有,程式碼也看不出有任何問題,沒辦法,加了很多log在程式碼裡,到伺服器上去跑。

       這個功能大致是這樣,進行一項比較耗時的計算,為了提高效能,將計算結果快取住,如果請求時間在5s內,直接返回,否則重新計算。

       檢查log,發現程式始終返回,沒有重新計算過。發現如下程式碼:

       long t1 = GetTickCount();
       if (t1 - m_Block_Inteval < 5000)  //判斷時間是否超過5s,m_Block_Inteval 初始為0
      {
           CHqDataBuffer* tempBuffer;
           //如果有該緩衝資料就直接返回,
           if (BlockKindBuffer->Lookup(szBlockKind,(void *&)tempBuffer)){
               Send(BlockBuffer->m_lpszBuffer,BlockBuffer->m_cbBuffer,lMask);
               return;
           }
      }

       在這裡始終返回,突然想起GetTickCount是取得系統從開機到現在的毫秒數,難道是溢位了?打了一下log,果然溢位了,而m_Block_Inteval 初始為零,所以這裡永遠小於5000。

       知道問題了,解決就很簡單,將t1/1000,得到秒數就ok。

       GetTickCount常常用來判斷某個方法執行的時間,常常是方法開始得到t1,方法執行完得到t2,相減得到時間差。所以不存在這個問題。但是使用GetTickCount的時候一定要注意溢位的問題。