我最近决定我需要为我的Timer类从使用毫秒更改为微秒,经过一些研究后,我认为QueryPerformanceCounter可能是我最安全的选择.(关于Boost::Posix它可能不适用于Win32 API 的警告让我有点失望).但是,我不确定如何实现它.
我正在做的是调用GetTicks()我正在使用的任何esque函数并将其分配给Timer的startingTicks变量.然后找到通过的时间量我只是从中减去函数的返回值startingTicks,当我重置计时器时,我再次调用该函数并为其分配startingTicks.不幸的是,从我看到的代码中,它并不像调用那么简单QueryPerformanceCounter(),而且我不确定我应该传递什么作为它的参数.
在Windows上我遇到了一个我从未在Unix上遇到过的问题.这是如何使线程休眠不到一毫秒.在Unix上,您通常有许多选择(睡眠,睡眠和纳米睡眠)以满足您的需求.但是,在Windows上,只有Sleep具有毫秒级的粒度.
在Unix上,我可以使用select系统调用来创建一个非常简单的微秒睡眠:
int usleep(long usec)
{
struct timeval tv;
tv.tv_sec = usec/1000000L;
tv.tv_usec = usec%1000000L;
return select(0, 0, 0, 0, &tv);
}
Run Code Online (Sandbox Code Playgroud)
如何在Windows上实现相同的目标?
我们可以在C#应用程序中设置两个线程或两个任务以执行不同的处理器关联吗?
我已经读过SetThreadAffinityMask但没有找到应该如何使用的例子.
或者,TPL(任务并行库)有没有办法执行两个线程/高优先级的任务来使用100%的CPU?
我有运行循环的线程.我需要每5ms运行一次循环(1ms错误).我知道Sleep()函数不精确.
你有什么建议吗?
更新.我不能以其他方式做到这一点.在循环结束时,我需要某种睡眠.我也不想加载100%的CPU.
我想描述软件计时器的准确性.我不太关心它是如何准确的,但确实需要知道准确性是什么.
我已经研究了c函数clock()和WinAPI的函数QPC和timeGetTime,我知道它们都依赖于硬件.
我正在测量一个可能需要大约5-10秒的过程,而且我的要求很简单:我只需要0.1秒精度(分辨率).但我确实需要知道准确性是什么,最坏的情况.
虽然更优先考虑更准确,但我宁愿知道准确性差(500毫秒)并且考虑到它,而不是相信精确度更好(1毫秒)但不能记录它.
有没有人有关于如何表征软件时钟准确性的建议?
谢谢