当前位置: 代码迷 >> WinCE >> 定时器精确到ms级甚或s都不准
  详细解决方案

定时器精确到ms级甚或s都不准

热度:159   发布时间:2016-04-28 11:58:57.0
定时器精确到ms级甚至s都不准
wince工控机有一个实时显示数据的功能,我在xp中模拟,
SetPriorityClass(GetCurrentProcess(), REALTIME_PRIORITY_CLASS);提升了当前进程的优先级;
SetThreadPriority(handle,THREAD_PRIORITY_TIME_CRITICAL);实时数据的功能是在这个线程中完成的,也提升了优先级。但用sleep(1000)或

void wait(int seconds)
{
clock_t endwait;
endwait = clock() + seconds *CLK_TCK;
while(clock() < endwait)
{

}
}
都不能准确的进来,出现掉数据的情况,想问大家是怎么解决的?

------解决方案--------------------
用 GET TICK 来做吧,

GET TICK 返回的是 MS 为单位,
相差 1000 MS 表示 1S 
------解决方案--------------------
可以考虑使用多媒体计时器,精度很好
------解决方案--------------------
楼主,用SleepTillTick  很精确到1ms的边界触发一次时间。 我用示波器打过,很精确。网上也说延迟是微秒级别。 楼主可以试试。

给你个例子:


typedef void (*PFN_SleepTillTick)(); 

int _tmain(int argc, _TCHAR* argv[])
{
     PFN_SleepTillTick SleepTillTick = NULL;
     HINSTANCE hInst = LoadLibrary(L"coredll.dll");

     SleepTillTick = (PFN_SleepTillTick)GetProcAddress(hInst, L"SleepTillTick");

     if (NULL == SleepTillTick)
     {
         wprintf(L"error\n");
         return -1;
     }

     while (1)
     {
         SleepTillTick( );
         // do your job
     }

     return 0;
}

------解决方案--------------------
500ms很容易就准确吧,实际上刷数据不可能刷太快,根本就看不过来。所以普通的定时器我觉得都够了。
是不是你代码有啥问题,比如每个周期要做很多事情,导致定时器卡了?
  相关解决方案