如何解析Wince的時(shí)間精度問題 ,很多新手對此不是很清楚,為了幫助大家解決這個(gè)難題,下面小編將為大家詳細(xì)講解,有這方面需求的人可以來學(xué)習(xí)下,希望你能有所收獲。
創(chuàng)新互聯(lián)建站專注于企業(yè)網(wǎng)絡(luò)營銷推廣、網(wǎng)站重做改版、柳城網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、HTML5、成都做商城網(wǎng)站、集團(tuán)公司官網(wǎng)建設(shè)、成都外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為柳城等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
GetSystemTime()或GetLocalTime(),在wince最多精確到秒級的精度, 那是因?yàn)樵谇度胧较到y(tǒng)里面,系統(tǒng)的時(shí)間是由RTC(一般是在CPU內(nèi)部的一個(gè)硬件邏輯)來保持的,它是以秒為單位,每過一秒就自加1來計(jì)時(shí).所以它的精確 范圍只能到秒.這點(diǎn)你可以在很多BSP的KERNEL里查看OEMGetRealTime()函數(shù)的實(shí)現(xiàn)就知道了. 當(dāng)你調(diào)用API:GetSystemTime()或GetLocalTime()時(shí),KERNEL會(huì)調(diào)用OEMGetRealTime()函數(shù)來返回給你 結(jié)果.而在OEMGetRealTime()里面,基于上述的原因,把ms=0.所以你只能得到秒級的精確度.
我不清楚PC上是怎么實(shí)現(xiàn)這個(gè)函數(shù)的,但肯定是和硬件相關(guān)的
一 般的CPU還會(huì)有一部分叫OSTimer的邏輯功能,它能夠提供類似RTC,但是是毫秒精度的計(jì)時(shí).在WINCE里,KERNEL有一個(gè)CurMSec變 量,這個(gè)變量時(shí)以毫秒為單位,來保存系統(tǒng)從啟動(dòng)到現(xiàn)在運(yùn)行了多長時(shí)間.實(shí)際上CurMSec這個(gè)變量是靠OSTIMER來計(jì)算的.當(dāng)你調(diào)用 GetTickCount()時(shí),系統(tǒng)會(huì)把CurMSec的值返回給你,你可以通過在做某次動(dòng)作的前后各調(diào)用GetTickCount()獲得一個(gè)時(shí)間 差,就是你執(zhí)行這次動(dòng)作消耗的時(shí)間, 它是毫秒精度的.
WINCE 微秒、毫秒級延時(shí)函數(shù)
//WINCE 微秒級延時(shí)函數(shù)
void delay_us(int n){
LARGE_INTEGER litmp;
LONGLONG QPart1,QPart2;
double dfMinus, dfFreq, dfTim;
if(QueryPerformanceFrequency(&litmp)==FALSE)
{
MessageBox(NULL,TEXT("Error:QueryPerformanceFrequency"),TEXT("Error"),MB_OK);
return;
}
dfFreq = (double)litmp.QuadPart;
QueryPerformanceCounter(&litmp);
QPart1 = litmp.QuadPart;
do
{
QueryPerformanceCounter(&litmp);
QPart2=litmp.QuadPart;
dfMinus=(double)(QPart2-QPart1);
dfTim=dfMinus/dfFreq;
}while(dfTim <0.000001*n);
}
//毫秒級的延時(shí)函數(shù)
void delay_ms(DWORD tmp_time)
{
DWORD start;
DWORD time_i=0;
start=GetTickCount();
while(time_i<=tmp_time)
{
time_i=GetTickCount()-start;
}
}
看完上述內(nèi)容是否對您有幫助呢?如果還想對相關(guān)知識(shí)有進(jìn)一步的了解或閱讀更多相關(guān)文章,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝您對創(chuàng)新互聯(lián)的支持。