对于普通优先级进程,我可以将单个线程的优先级设置为高于15吗?

jac*_*see 5 c++ windows multithreading timing

我有一个在Windows 7上运行的数据采集应用程序,使用C++中的VC2010.一个线程是一个心跳,每隔0.2秒发送一次更改,以保持一些超时约为0.9秒的硬件.通常情况下,心跳呼叫需要10-20ms,并且线程会花费剩余的时间来休眠.

但偶尔会有1-2秒的延迟,硬件会暂时关闭.心跳线程在THREAD_PRIORITY_TIME_CRITICAL运行,正常优先级进程为15.我的其他线程都在正常优先级运行,虽然我使用了一个DLL控制一些其他硬件和与它开始于15水平运行多个线程的Process Explorer已经注意到了.

我无法追踪减速的来源,但我的应用程序中的其他theads在发生这种情况时会看到同样的延迟.我已经对心跳代码进行了几次优化,即使它非常简单,但偶尔也会发生故障.现在我想知道如果不为整个过程指定REALTIME_PRIORITY_CLASS,我是否可以将此线程的优先级提高到15以上.如果没有,我应该注意使用REALTIME_PRIORITY_CLASS有什么缺点吗?(除了这个心跳线程,应用程序的其余部分没有实时计时需求.)

(或任何人对如何追查这些减速...不知道任何想法如果源可能是在我的应用程序或其他地方的系统).

更新:所以我还没有真正尝试通过31进我AfxBeginThread电话,原来它忽略了价值,并设置线程正常优先级,而不是我用THREAD_PRIORITY_TIME_CRITICAL得到15.

更新:结果运行磁盘碎片整理程序是导致大量线程延迟的好方法.即使在运行在REALTIME_PRIORITY_CLASS THREAD_PRIORITY_TIME_CRITICAL(31级)的进程和线程的心跳似乎没有帮助.接下来要尝试的是调用AvSetMmThreadCharacteristics("专业音频")

更新:调度心跳线为"专业音响"确实工作增加超过15(底= 1,动态= 24)线程的优先级,但它似乎并没有做碎片整理时运行任何真正的区别.我已经能够将许多减速与磁盘碎片整理程序相关联,因此关闭了每周扫描.仍然无法解释一些延迟,所以我们将增加到5-10秒看门狗超时.

wal*_*lyk 4

即使可以,提高优先级也无济于事。优先级最高的可运行线程始终获得处理器。

当中断被禁用时,很可能会发生一些扩展的中断处理。中断实际上以比任何线程更高的优先级工作。

它可以是视频、网络、磁盘、串行、USB 等。有选择地禁用或使用备用驱动程序需要一些洞察力,以查看问题系统犹豫是否受到影响。一旦你发现了这一点,那么找出一种方法来阻止它可能是微不足道的,也可能是不可能的,具体取决于它是什么。

如果没有更多关于系统的知识,很难说。您是否尝试过在另一台电脑上运行它?