2013-04-15 25 views
0

我正在编写一个应用程序,将输入从一个设备转换为另一个设备 - 说一个头部跟踪格式到另一个,主要用于支持游戏中多种类型的头部跟踪。Windows毫秒计时 - 没有busywait?

大多数情况下,我的程序输入是通过轮询共享内存来提供的。然而,在一个紧密的循环中这样做会不必要地消耗一个CPU内核。该应用程序不会降低游戏体验势在必行。

在Windows上的默认计划时间似乎是60赫兹,所以睡眠差不多了。我需要少于5毫秒,但偶尔的点是好的。

我宁愿不影响系统配置通过影响系统范围计时器。

什么是我的选择,以防止消耗核心,但仍主要执行一些方法每1毫秒左右一次,使用C或.net?

我要寻找的解决方案为Windows 7

+0

中断并没有帮助你......?只是有点好奇... –

+0

@HirenPandya帮助我如何?我没有设备为我生成中断,因为它们(输入设备)使用共享内存? – Max

+0

'我的程序的输入是通过轮询共享内存来传递的,关于这一行,我有点困惑,我的意思是,只要输入在任何输入设备的共享内存中可用,就不能中断程序。我仍然对你的问题有些困惑,所以放置一些愚蠢但清除点.. –

回答

-1

如果进程间同步是出了问题,尝试使用SetTimer功能。它可以以毫秒为间隔调用您的回调。

如果你想要一个毫秒级的睡眠,你可以使用WaitForSingleObject。只要给它一些不会改变自己状态的事件句柄。

但是,所有这些选项都是相当不可靠的,因为Windows不会给你时间保证,而且如果系统过载,结果将不会很好。

+0

-1。您[SetTimer()']不能超过10 ms(http://msdn.microsoft.com /en-us/library/windows/desktop/ms644906%28v=vs.85%29.aspx)。OP需要1到5毫秒。 –

+0

@AlexeyFrunze我相信这取决于使用的操作系统。例如,Windows 8 RT可能会获得所需的结果。但通常我同意:在Windows上,确保所需的响应时间非常困难(几乎不可能)。 –

2

看起来你只有两种选择:

  1. 使用Multimedia Timers,但你似乎不喜欢这个想法。
  2. 在所有长循环中都会调用函数调用,在那里检查TSCPerformance Counter,并在时间正确时执行需要执行的任何操作。
+0

我大约10年前在一个项目上使用了多媒体定时器,其中1ms超时而不影响系统范围的定时器。 – Neil

+0

@Neil据我了解,如果有多媒体定时器的另一个用户,两者之间可能会有一些干扰。 –

+0

谢谢。我会重新评估mm计时器,但是我最后一次尝试,以及如果我记得正确的话,msdn文档说他们需要使用beginsettime来实现ms计时器。你知道win32格式或wpf如何实现低延迟,而不消耗整个cpu吗? – Max