http://blog.oasisfeng.com/2006/10/07/timer-in-symbian-development/
2006.10 |
(1)TTime::HomeTime() / TTime::UniversalTime()
最常見的時間獲取手段,精度不高;因涉及一定的運算過程,效率較低。適用於需要以常規“年月日時分秒”方式使用時間的場合。在EKA2平臺下,其精度與低階系統時鐘(Nanokernel Timer)一致,通常爲微妙級別。通過 HAL::Get(HAL::ENanoTickPeriod, result) 可以獲的具體精度。
注意:它們使用的是系統時間,這是可以被其它進程修改的。
(2)User::TickCount()
傳統的Tick計數器,精度通常僅爲1/64秒(可能隨硬件有差異),適用於精度要求較低的場合。通過 HAL::Get(HAL::ESystemTickPeriod, result) 可以獲得具體精度。
注意:在休眠(Standby)狀態下,TickCount將停止計數,所以User::TickCount()在休眠狀態下將“損失”計時!
(3)User::NTickCount()
低階系統時鐘(Nanokernel Timer),通常提供微妙級Tick。通過 HAL::Get(HAL::ENanoTickPeriod, result) 可以獲得具體精度。
注意:Symbian OS 6.x 沒有此API。與TickCount不同的是,User::NTickCount()在休眠狀態下不“損失”計時。
(4)User::FastCounter()
返回值類似於Tick,提供Symbian OS所能支持的最高精度,通常比TTime::HomeTime()更準確。(如果硬件不支持high resolution timer,則毫秒級時鐘替代)而且,因爲它採用快速的exec call讀取一個硬件寄存器的數值,效率很高。通過 HAL::Get(HALData::EFastCounterFrequency, result) 可以獲得其具體精度。
注意:在每次終端從休眠狀態激活後,它將同步至正確的數值,也就是說User::FastCounter()在休眠狀態下其實也是不“損失”計時的。
另外,User::After(), CPeriodic也會在休眠狀態下“損失”計時,所以在手機這種特殊的應用環境中,需要特別注意不同定時器在“休眠”狀態下計時的差異。
轉者附加:
(2)中提到的方法如下
TInt period;
User::LeaveIfError(HAL::Get(HALData::ESystemTickPeriod, period));
TInt logMillisecsPerTick = period / 1000;
TBuf<50> text;
TInt timeInMillisecs = User::TickCount() * logMillisecsPerTick;
TInt secs = timeInMillisecs / 1000;
TInt millisecs = timeInMillisecs % 1000;
text.Num(secs);
text.Append('.');
text.Num(millisecs);// 秒.毫秒 精度通常僅爲1/64秒(可能隨硬件有差異)在模擬器上是1/100秒,
ShowTextOnScreen(text);