Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我可以设置单个线程吗';对于一个正常的优先级过程,优先级是否高于15? 我在Windows 7上运行了一个数据采集应用程序,使用VC2010在C++中运行。一个线程是一个心跳信号,它每.2秒发送一次更改,以保持某些硬件的活动状态,这些硬件的超时时间约为.9秒。通常心跳调用需要10-20ms,线程将剩余时间用于睡眠_C++_Windows_Multithreading_Timing - Fatal编程技术网

我可以设置单个线程吗';对于一个正常的优先级过程,优先级是否高于15? 我在Windows 7上运行了一个数据采集应用程序,使用VC2010在C++中运行。一个线程是一个心跳信号,它每.2秒发送一次更改,以保持某些硬件的活动状态,这些硬件的超时时间约为.9秒。通常心跳调用需要10-20ms,线程将剩余时间用于睡眠

我可以设置单个线程吗';对于一个正常的优先级过程,优先级是否高于15? 我在Windows 7上运行了一个数据采集应用程序,使用VC2010在C++中运行。一个线程是一个心跳信号,它每.2秒发送一次更改,以保持某些硬件的活动状态,这些硬件的超时时间约为.9秒。通常心跳调用需要10-20ms,线程将剩余时间用于睡眠,c++,windows,multithreading,timing,C++,Windows,Multithreading,Timing,但是,偶尔会有1-2秒的延迟,硬件会立即关闭。心跳线程以线程优先级时间临界值运行,正常优先级进程为15。我的其他线程以正常优先级运行,尽管我使用DLL来控制其他一些硬件,并且注意到Process Explorer在15级启动了几个线程 我无法找到速度减慢的原因,但我的应用程序中的其他Thead在发生这种情况时也会出现同样的延迟。我已经对heartbeat代码进行了几次优化,尽管它非常简单,但是偶尔的失败仍然在发生。现在我想知道是否可以在不为整个进程指定REALTIME\u priority\u类

但是,偶尔会有1-2秒的延迟,硬件会立即关闭。心跳线程以线程优先级时间临界值运行,正常优先级进程为15。我的其他线程以正常优先级运行,尽管我使用DLL来控制其他一些硬件,并且注意到Process Explorer在15级启动了几个线程

我无法找到速度减慢的原因,但我的应用程序中的其他Thead在发生这种情况时也会出现同样的延迟。我已经对heartbeat代码进行了几次优化,尽管它非常简单,但是偶尔的失败仍然在发生。现在我想知道是否可以在不为整个进程指定REALTIME\u priority\u类的情况下将该线程的优先级提高到15以上。如果没有,我是否应该注意使用REALTIME\u PRIORITY\u类的缺点?(除此心跳线程外,应用程序的其余部分不需要实时计时。)

(或者有没有人对如何追踪这些减速有任何想法……不确定来源是否在我的应用程序中或系统上的其他地方)

更新:所以我实际上并没有尝试将31传递到我的AfxBeginThread调用中,结果它忽略了该值,并将线程设置为正常优先级,而不是我在thread\u priority\u TIME\u CRITICAL时得到的15

更新:运行磁盘碎片整理程序是导致大量线程延迟的好方法。即使在实时优先级级别运行进程,在线程优先级时间关键级别(级别31)运行心跳线程,似乎也没有什么帮助。接下来要尝试的是调用AvSetMmThreadCharacteristics(“Pro Audio”)


更新:将heartbeat线程调度为“Pro Audio”确实可以将线程的优先级提高到15以上(Base=1,Dynamic=24),但在碎片整理运行时,这似乎并没有任何实际的区别。我已经能够将许多减速与磁盘碎片整理程序关联起来,因此关闭了每周扫描。仍然无法解释某些延迟,因此我们将增加到5-10秒的看门狗超时。

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

中断被禁用时,很可能会发生一些扩展中断处理。中断的优先级比任何线程都高

它可以是视频、网络、磁盘、串行、USB等。要有选择地禁用或使用备用驱动程序来查看问题系统的迟疑是否受到影响,需要一些洞察力。一旦你发现了这一点,那么根据它是什么,找出一种防止它的方法可能从琐碎到不可能


如果没有更多关于这个系统的知识,很难说。你试过在另一台电脑上运行它吗?

我会尝试使用CreateWaitableTimer()&SetWaitableTimer(),看看它们是否存在相同的抢占问题。

正式地说,你不能在没有实时优先级的进程中使用实时线程

非正式地,您可以使用未记录的
NtSetInformationThread
见:

但是因为我没有试过,所以我没有更多关于这个的信息

另一方面,正如前面所说的,当线程的数量将过期时,您永远无法确定操作系统是否会不慌不忙。某些写得不好的驱动程序通常是造成这种延迟的原因

否则,有一个软件可以告诉您是否有不正常的内核部件:

感谢您的信任投票:)我在几台不同的计算机上运行过,但通常都安装了相同的软件和驱动程序。我会考虑我可以禁用和运行什么,但很难跟踪,因为问题是间歇性的,似乎每天都会发生。谢谢我希望它会有所不同的原因是,这个其他硬件dll在15级有5/7的线程。当事情变得繁忙时,我宁愿我的线程优先于它们。但是,如果像你建议的那样是硬件中断,那就没用了。当人们在有关Windows的编程问题中使用诸如“心跳”和“出于安全原因关闭”之类的词时,我会感到害怕。:)这当然不是RTOS:我认为你的看门狗太严格了。在RTOS上,500毫秒是足够的,但在Windows上,任何低于15秒的操作都是有风险的。如果你可以控制你的看门狗,那么我建议延长超时时间,或者只有当它错过了一定数量的触发器时才关闭它。问题:你的硬件将在什么时候关闭?如果没有收到心跳信号,将关闭。最后一次触发后5秒。我喜欢你关于增加超时的评论,我们可能会这样做,但我想首先尝试从软件方面进行优化。我不认为我们可以用15秒,但也许5秒如果你的电脑音量控制设置为“11”,你可以将优先级设置为16。如果你发现DPC延迟会急剧增加,那么线程优先级就帮不了你,因为DPC(延迟过程调用)的“优先级”(实际上是IRQL)比用户模式下的任何东西都要高。。。