gpt4 book ai didi

c# - 了解多媒体计时器的奇怪行为

转载 作者:行者123 更新时间:2023-12-01 17:47:00 25 4
gpt4 key购买 nike

我在我的应用程序 (C# .NET) 中使用多媒体计时器来提高计时器的准确性并实现 1 毫秒的计时器频率。到目前为止,我的应用程序一直运行良好,直到最近它开始表现奇怪。我试图了解我的应用程序出了什么问题。以下是采取的步骤

  1. 定时器频率设置为1毫秒,每1毫秒调用一次回调
  2. 有 4 个线程,每个线程创建自己的计时器对象。它们都设置为 1ms 后调用回调。这些是单独的实例,不共享。
  3. 旧代码执行时间约为 0.3 毫秒。在下一步之前一切正常。
  4. 应用程序代码已更改。计时器回调函数现在执行大约需要 1.2 毫秒。这显然是一个问题。 (稍后我将致力于优化代码。但现在我只想了解多媒体计时器的行为)
  5. 只有第一个线程正在调用计时器回调,而对于其他线程,回调仅被调用两次或三次,此后回调将不再被调用。
  6. 看起来对于其他线程来说,计时器甚至错过了(?)并且无法 catch 。 (每次中断都会错过)。

您能解释一下计时器对象的行为吗?由于它是单个进程,所有线程实际上都指向同一个计时器对象吗?为什么其他线程没有调用计时器回调?

最佳答案

多媒体定时器的最大分辨率为1ms。这会导致可编程中断 Controller (在硬件上)每 1ms 触发一次。如果您启动 4 个线程,它们都创建具有 1 毫秒计时的计时器,这并不意味着您每毫秒会收到多次事件。

我鼓励您阅读Why are the Multimedia Timer APIs (timeSetEvent) not as accurate as I would expect? MSDN 上的博客文章。

一些适用于此的引言(强调我的):

The MM Timer APIs allow the developer to reprogram the Programmable Interrupt Controller (PIC) on the machine. You can specify the new timer resolution. Typically, we will set this to 1 millisecond. This is the maximum resolution of the timer. We can’t get sub-millisecond accuracy. The effect of this reprogramming of the PIC is to cause the OS to wake up more often. This increases the chances that our application will be notified by the operating system at the time we specified. I say, “Increases the chances” because we still can’t guarantee that we will actually receive the notification even though the OS work up when we told it.

还有:

Remember that the PIC is used to wake up the OS so that it can decide what thread should be run next. The OS uses some very complex rules to determine what thread gets to occupy the processor next. Two of the things that the OS looks at to determine if it should run a thread or not are thread priority and thread quantum.

因此,即使您将分辨率降低到最大值 1 毫秒,也不能保证您的线程将被选择执行其工作。

关于c# - 了解多媒体计时器的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20343099/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com