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

2023-12-22

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

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

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


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

我鼓励您阅读为什么多媒体计时器 API (timeSetEvent) 不如我预期的那么准确? http://blogs.msdn.com/b/mediasdkstuff/archive/2009/07/02/why-are-the-multimedia-timer-apis-timesetevent-not-as-accurate-as-i-would-expect.aspxMSDN 上的博客文章。

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

MM 定时器 API 允许开发人员重新编程可编程 机器上的中断控制器(PIC)。您可以指定新的 计时器分辨率。通常,我们会将其设置为 1 毫秒。这 是定时器的最大分辨率。我们无法达到亚毫秒级 准确性。PIC 重新编程的效果是导致 操作系统更频繁地唤醒。这增加了我们的机会 应用程序将在我们执行操作时由操作系统通知 指定的。我说“增加机会”是因为我们仍然不能 保证我们确实会收到通知,即使 当我们告诉它时,操作系统就会启动。

And:

请记住,PIC 用于唤醒操作系统,以便它可以决定 接下来应该运行哪个线程。操作系统使用一些非常复杂的规则来 确定接下来哪个线程将占用处理器。其中两个 操作系统查看以确定是否应该运行线程或 线程优先级和线程量子不是。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

了解多媒体计时器的奇怪行为 的相关文章

  • Unix网络编程澄清

    我正在翻阅这本经典书籍Unix网络编程 https rads stackoverflow com amzn click com 0139498761 当我偶然发现这个程序时 第 6 8 节 第 179 180 页 include unp h
  • 如何检查QProcess是否正确执行?

    QProcess process sdcompare QString command sdcompare QStringList args sdcompare command sdcompare diff args sdcompare lt
  • 如何在 C# 中从 UNIX 纪元时间转换并考虑夏令时?

    我有一个从 unix 纪元时间转换为 NET DateTime 值的函数 public static DateTime FromUnixEpochTime double unixTime DateTime d new DateTime 19
  • 在 Unity 进程和另一个 C# 进程之间进行本地 IPC 的最快方法 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我希望每秒大约 30 次从 C 应用程序向我的 Unity 应用程序传送大量数据 由于 Unity 不支持映射内存和管道 我考虑了 t
  • 在 C# 中循环遍历文件文件夹的最简单方法是什么?

    我尝试编写一个程序 使用包含相关文件路径的配置文件来导航本地文件系统 我的问题是 在 C 中执行文件 I O 这将是从桌面应用程序到服务器并返回 和文件系统导航时使用的最佳实践是什么 我知道如何谷歌 并且找到了几种解决方案 但我想知道各种功
  • 用于检查项目文件中的项目变量和引用路径的 api

    我正在研究一个 net application VS2010 与 x 没有 解和变量号这些解决方案中的项目数量 我需要检查项目属性 特定于一定数量的项目 是否同质 并且检查 验证构建期间的参考路径 有没有一个API是这样的吗 如果没有 我该
  • 如何在 C# 中定义文本框数组?

    您好 当我在 Windows 申请表上创建文本框时 我无法将其命名为 box 0 box 1 等 我这样做的目的是因为我想循环使用它们 其实我发现TextBox array firstTextBox secondTextBox 也有效
  • 如何在 Linq 中获得左外连接?

    我的数据库中有两个表 如下所示 顾客 C ID city 1 Dhaka 2 New york 3 London 个人信息 P ID C ID Field value 1 1 First Name Nasir 2 1 Last Name U
  • 单击 form2 上的按钮触发 form 1 中的方法

    我对 Windows 窗体很陌生 我想知道是否可以通过单击表单 2 中的按钮来触发表单 1 中的方法 我的表格 1 有一个组合框 我的 Form 2 有一个 保存 按钮 我想要实现的是 当用户单击表单 2 中的 保存 时 我需要检查表单 1
  • 将 Excel 导入到 Datagridview

    我使用此代码打开 Excel 文件并将其保存在 DataGridView 中 string name Items string constr Provider Microsoft Jet OLEDB 4 0 Data Source Dial
  • 未经许可更改内存值

    我有一个二维数组 当我第一次打印数组的数据时 日期打印正确 但其他时候 array last i 的数据从 i 0 到 last 1 显然是一个逻辑错误 但我不明白原因 因为我复制并粘贴了 for 语句 那么 C 更改数据吗 I use g
  • 在一个字节中存储 4 个不同的值

    我有一个任务要做 但我不知道从哪里开始 我不期待也绝对不想要代码中的答案 我想要一些关于该怎么做的指导 因为我感到有点失落 将变量打包和解包到一个字节中 您需要在一个字节中存储 4 个不同的值 这些值为 NAME RANGE BITS en
  • C++:.bmp 到文件中的字节数组

    是的 我已经解决了与此相关的其他问题 但我发现它们没有太大帮助 他们提供了一些帮助 但我仍然有点困惑 所以这是我需要做的 我们有一个 132x65 的屏幕 我有一个 132x65 的 bmp 我想遍历 bmp 并将其分成小的 1x8 列以获
  • Visual Studio 中的测试单独成功,但一组失败

    当我在 Visual Studio 中单独运行测试时 它们都顺利通过 然而 当我同时运行所有这些时 有些通过 有些失败 我尝试在每个测试方法之间暂停 1 秒 但没有成功 有任何想法吗 在此先感谢您的帮助 你们可能有一些共享数据 检查正在使用
  • 上下文敏感与歧义

    我对上下文敏感性和歧义如何相互影响感到困惑 我认为正确的是 歧义 歧义语法会导致使用左推导或右推导构建多个解析树 所有可能的语法都是二义性的语言是二义性语言 例如 C 是一种不明确的语言 因为 x y 总是可以表示两个不同的事物 如下所述
  • 私有模板函数

    我有一堂课 C h class C private template
  • HttpWebRequest 在第二次调用时超时

    为什么以下代码在第二次 及后续 运行时超时 代码挂在 using Stream objStream request GetResponse GetResponseStream 然后引发 WebException 表示请求已超时 我已经尝试过
  • 有人可以提供一个使用 Amazon Web Services 的 itemsearch 的 C# 示例吗

    我正在尝试使用 Amazon Web Services 查询艺术家和标题信息并接收回专辑封面 使用 C 我找不到任何与此接近的示例 所有在线示例都已过时 并且不适用于 AWS 的较新版本 有一个开源项目CodePlex http www c
  • 如何对 Web Api 操作进行后调用?

    我创建了一个 Web API 操作 如下所示 HttpPost public void Load string siteName string providerName UserDetails userDetails implementat
  • 编译时“strlen()”有效吗?

    有时需要将字符串的长度与常量进行比较 例如 if line length gt 2 Do something 但我试图避免在代码中使用 魔法 常量 通常我使用这样的代码 if line length gt strlen Do somethi

随机推荐

  • 如何区分 8086/8088 和 80186?

    我正在尝试编写一个程序来检查使用什么处理器来执行我的程序 由于它旨在用于许多历史上的 PC 克隆 因此我希望能够区分 8086 和 80186 以防万一该计算机是配备 80186 的罕见机器之一 我该怎么做在装配中 None
  • Spring MVC 中的 @SessionAttributes 什么时候被删除? (带有代码示例)

    SessionAttributes 在什么具体情况下会被清除 当尝试在页面中使用两个模型时 我发现了一些令人困惑的行为 当我使用此控制器执行 GET 操作并随后执行 POST 操作时 Controller RequestMapping my
  • 使用 SetFile 后 Java GetFile 返回错误的文件名

    我有一些Java代码 public static String getSaveFilePath String title2 FileDialog fd new FileDialog new Frame Save As 1 fd setFil
  • 关于Winsock Kernel Buffer和Nagle算法的疑问

    在读的时候this http support microsoft com kb 214397文章 我有一个疑问 据我了解 在传输小数据时 默认情况下会启用 Nagle 算法 该算法会合并小数据包 这会导致在传输之前缓存一些数据 我相信 Wi
  • Ruby-on-Rails:多个 has_many :through 可能吗?

    是否可以有多个has many throughRails 中相互传递的关系 我收到了这样做的建议 作为我发布的另一个问题的解决方案 但一直无法让它发挥作用 朋友是一个循环关联通过连接表 目标是创建一个has many through for
  • Xcode 5 - 无法构建模块

    我已经在我的项目 启用模块 C 和 ObjectiveC 中打开了标志 并且收到了 1000 多个错误 无法构建模块 安全 无法构建模块 基础 等等 对于每个包含的框架 还有其他人遇到过这个问题吗 我对 Social h 也有同样的问题 通
  • Android:strings.xml 中的 html

    我想显示例如这个html代码 p b Hello World b p p This is a test of the URL a href http www example com Example a p p b This text is
  • Javascript / React 中的动态配置变量

    我正在编写一个客户端 服务器应用程序 其前端 UI 基于 React 作为后端 Unix 开发人员 Web 技术不是我的强项 所以这对我来说是全新的 我需要能够配置 UI 以指向服务器的 URL 并设置其他首选项 典型的反应方法似乎是使用
  • 让 IE 缓存资源但始终重新验证

    缓存控制标头 no cache must revalidate private 允许浏览器缓存资源 但强制使用条件请求重新验证 这在 FF Safari 和 Chrome 中按预期工作 但是 IE7 8 不发送条件请求 即请求头中缺少 If
  • jQuery 插件:将 mCustomScrollbar 应用于 SCEditor

    我该如何申请m自定义滚动条 http manos malihu gr jquery custom content scroller to SCEditor http www sceditor com This http jsfiddle n
  • 模板模板成员继承带有“using”

    以下类实现 CRTP 我想要上课Derived使用提供的构造函数Base 所以我写using 但是 我收到错误消息 只能从直接基类继承构造函数 等价于成员变量x template
  • DateTime.ToBinary() 和 DateTime.ToFileTime() 有何不同?

    谁能帮忙解释一下两者之间的区别日期时间 ToBinary http msdn microsoft com en us library system datetime tobinary aspx and 日期时间 ToFileTime htt
  • WordPress 网站上 ModSecurity 的 Apache LocationMatch 通配符

    我在运行 WordPress 网站的 Ubuntu 14 04 Apache 2 4 7 上安装了 mod security 我有一些需要忽略的规则 但我在实现一些通配符规则时遇到了麻烦 这样我就不必指定每个页面 我所拥有的 在我的 sit
  • 如何将数据重定向到“getpass”(如密码输入)?

    我正在编写一个 python 脚本来运行一些命令 其中一些命令要求用户输入密码 我确实尝试在其标准输入中输入数据 但它不起作用 这里有两个简单的 python 程序代表问题 input py import getpass print raw
  • 锁定以将数据加载到缓存

    我在 Web 应用程序中有一个辅助类 它所做的事情之一就是将常见的 不变的数据对象呈现为静态属性 我正在加载这些对象 如下所示 public static class MyWebHelper region Constants Fields
  • 在有空间的路径中调用可执行文件时出现问题

    我刚刚在新的 Microsoft Windows 7 计算机上安装了 R 并且在使用命令行时出现以下错误 C Program Files R R 3 3 2 bin Rscript exe version C Program is not
  • javamail问题:如何附加文件而不创建文件

    我正在使用 javamail API 创建电子邮件并向其附加文件 有没有一种方法可以使用 javamail api 发送带有附件的电子邮件 无需在文件系统上物理创建文件 我只想从应用程序中选取一些数据 并将其作为文件附加到我的电子邮件中 我
  • Swift 中能否区分 Bool 和 Int?

    我有一个AnyObject类型可以是String Int or Bool类型 我需要区分它们 这段代码试图这样做 但它考虑了Bool to be Int import Cocoa var value AnyObject func check
  • 如何删除被覆盖模块上的路由?

    I added zfcUser通过 Composer 将模块添加到我的项目并在模块中覆盖它ZfcUserOverride 我想要尾部斜杠工作 所以我在覆盖的模块中添加了路线 zfcUserOverride file module confi
  • 了解多媒体计时器的奇怪行为

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