【问题标题】:How to be sure that the process is set to REAL_TIME priority如何确保进程设置为 REAL_TIME 优先级
【发布时间】:2012-01-19 15:51:06
【问题描述】:

我正在使用 Windows XP 上的 Visual Studio 开发控制台 C++ 应用程序,该应用程序必须为调度程序提供尽可能高的优先级。

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

 }

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

我尝试将每帧的时间长度保存到文件中,但在我想要的时间附近发现了一个奇怪的“量化”。为什么?

我还发现有时长度是我的基本帧时间的倍数,这是由干扰内部操作系统引起的吗?进程?

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

【问题讨论】:

  • 记住几件事。首先,Windows XP 不提供实时保证,即使对于“实时”优先级也是如此,因此理论上您无法实现您想要的(实际上,您的里程可能会有所不同)。其次,写入文件会在您的测量中引入 巨大 偏差。可能只是你看到的“量化”其实是I/O系统造成的。
  • 那么在这种情况下测量时序的方法应该是什么?将 delta t 附加到列表中,当程序完成时,刷新它?
  • 这可能会引入更小(且更可预测)的偏差,特别是如果列表是预先分配的。您也可以定期刷新它,这甚至可以让您测量文件偏差。如果您愿意,可以使用一些技术来衡量偏差本身(尽管这不会帮助您保持 10 毫秒的时间范围)。
  • 通常使用驱动程序和相关的缓冲区和信号来进行此类操作。您的硬件接口如何工作?视频 I/O 通常是延迟和帧速率之间的权衡——如果没有大量“松弛”——驱动程序、线程和帧缓冲区队列,很难维持高帧速率。磁盘写入相同 - 在没有排队/延迟的情况下“实时”写入文件通常是不可能的,尤其是在旋转媒体的情况下。
  • 我的硬件接口是一个与红外跟踪系统通信的 PCI 卡,而我的程序是用 Glut 编写的,需要在硬盘上保存每一帧标记位置的信息。

标签: c++ process real-time win32-process


【解决方案1】:

您只需致电SetThreadPriority

我是这样用的:

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

请注意,其他应用程序也可以这样做,因此两个线程将具有相同的优先级。

【讨论】:

  • 如何混合 boost::thread 与 Win32 api 调用 GetCurrentThread 和 SetThreadPriority?
  • boost在windows上的实现会调用同样的代码。你可以查看boost源代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-25
  • 1970-01-01
相关资源
最近更新 更多