2012-01-19 17 views
0

我正在开发一个控制台C++应用程序,使用Windows XP上的Visual Studio,它必须处于调度程序可能的最高优先级。如何确保该过程设置为REAL_TIME优先级

int main() 
{ 
    while (somecondition) 
    { 
     // pick data from external hardware every 10 milliseconds 
     // do computation 
    } 

} 

我的意思是没有其他系统进程应该干扰它,因为它是调整刷新帧缓冲每10毫秒的实时数据采集系统。

我试图将每帧的时间长度保存到一个文件中,并在我期望的时间周围发现了一个奇怪的“量化”。为什么?

我还发现有时长度是我的基准帧时间的倍数,这是由干扰内部O.S.引起的。流程?

有没有办法确保我的程序的最高优先级?

+1

请记住几件事情。首先,即使对于“实时”优先级,Windows XP也不提供实时保证,因此无法在理论上达到您想要的效果(实际上,您的里程可能会有所不同)。其次,写入文件会给测量带来巨大的偏差。这可能只是因为你看到的“量化”实际上是由I/O系统引起的。 –

+0

那么在这种情况下应该怎样测量计时呢? 将delta t附加到列表中,并在程序完成时将其冲洗? – linello

+0

这可能会引入一个更小(更可预测)的偏见,特别是如果列表是预先分配的。您也可以定期刷新它,这可能甚至允许您衡量文件偏差。有些技术可以衡量偏见本身,如果您愿意的话(尽管这不会帮助您保持10毫秒的时间范围)。 –

回答

2

所有你需要的是调用SetThreadPriority

我用这样的:

HANDLE hThread = GetCurrentThread(void); 
SetThreadPriority(hThread, THREAD_PRIORITY_TIME_CRITICAL); 

只是要注意的是其它应用程序可以做相同的,所以这两个线程将具有相同的优先级。

+0

我会尽力而为,如果它有效,我会通知你,谢谢! – linello

+0

如何将boost :: thread与win32 api混合调用GetCurrentThread和SetThreadPriority? – linello

+0

Windows上的boost实现将调用相同的代码。您可以检查boost源代码。 – rkosegi