使用C确保精确计时的最佳方法

时间:2010-05-14 19:24:38

标签: c time

我是一名C程序员(虽然不是初学程序员),希望深入研究一个项目来自学C.我的项目是基于音乐的,因此我很好奇是否有任何“最佳实践” -se,涉及计时功能。

为了澄清,我的项目几乎是尝试构建一些准系统音乐符号/组合软件(请记住,强调准系统)。我最初考虑使用OSX作为我的平台,但我想用C语言做,而不是Obj-C(虽然我知道它可能会更容易...... CoreAudio看起来像是一个非常强大的工具来处理这类东西)。所以即使我没有 在Obj-C中构建OSX应用程序,我最终可能会在linux系统上构建它(可能是debian ......)。

感谢大家,感谢您的回答。

4 个答案:

答案 0 :(得分:4)

计时功能有两种准确的方法:

  1. 单个流程执行。
  2. 计时器事件处理程序/回调
  3. 单一流程执行
    大多数现代计算机同时执行多个程序 。实际上,他们执行许多程序的各个部分,根据优先级和其他指标交换它们,看起来像是同时执行多个程序。这种开销会影响程序中的计时。程序在读取时间时会延迟,或者在设置自己的时间变量时操作系统会延迟。

    这种情况下的解决方案是从运行中消除任意数量的任务。理想的环境是最好的准确性是让您的程序作为唯一的程序运行。某些操作系统为超级用户应用程序提供API以阻止所有其他程序或终止它们。

    计时器事件处理/回调
    由于不能信任操作系统以高精度执行程序,因此大多数操作系统都会提供Timer API。其中许多API包括在计时器到期时调用其中一个函数的功能。这称为回调函数。其他操作系统可能会在计时器到期时发送消息或生成事件。这些属于计时器处理程序类。回调过程比处理程序具有更少的开销,因此更准确。

    音乐硬件

    虽然您的程序可能会将音乐发送到扬声器,但现在许多计算机都有独立的处理音乐的处理器。这释放了主处理器并提供了更多连续音符,而不是由于程序的平台开销而将静音间隙分开的声音将下一个声音发送到扬声器。

    高质量的音乐处理器至少具备以下功能:

    1. 开始播放
    2. 结束音乐通知
    3. 开始播放 这是您告诉音乐处理器数据所在位置和数据大小的功能。处理器将开始播放音乐。

      结束音乐通知 您为处理器提供指向处理音乐数据时将调用的函数的指针。好的处理器会提前调用该函数,因此重新加载时声音不会有间隙。

      所有这些都取决于平台,并且可能不是跨平台的标准。

      希望这有帮助。

答案 1 :(得分:2)

这是一个相当广阔的领域,而且,根据你想要做的事情,可能非常困难。

你说你的项目是“以音乐为基础”,你不会给予太多帮助。

  • 是乐谱排版程序吗?
  • 是处理音频吗?
  • 是否过滤MIDI数据?
  • 是否对MIDI数据进行排序?
  • 是否从MIDI数据生成音频
  • 是否仅执行播放?
  • 是否需要在实时环境中运行?

你的问题虽然暗示了实时操作,所以在这种情况下...

在实时环境中工作时的一般规则是不要做任何可能阻止实时线程的事情。这包括:

  • 调用free / malloc / calloc / etc(动态内存分配/释放)。
  • 文件I / O.any
  • 在线程上使用自旋锁/信号量/互斥锁。
  • 调用GUI代码。
  • 致电printf。

考虑到实时音乐应用程序的这些注意事项,您将不得不学习如何在C中执行多线程以及如何将数据从UI / GUI线程传递到实时线程没有打破上述限制的任何

对于开源实时音频(和MIDI)(路由)服务器,请查看http://jackaudio.org

答案 2 :(得分:1)

gettimeofday()是最好的挂钟时间。 getrusage()最适合CPU时间,尽管它可能不便携。 clock()对于CPU时序更具可移植性,但它可能有整数溢出。

答案 3 :(得分:0)

这非常依赖于系统。您使用的操作系统是什么?

您可以查看gettimeofday()的相当高的粒度。如果您只需要偶尔阅读一次,它应该可以正常工作。

SIGALRM / setitimer可用于定期接收中断。此外,一些系统具有更高级别的库来处理时间。