【问题标题】:ObjC/C/C++ high resolution timer with callback带回调的 ObjC/C/C++ 高分辨率计时器
【发布时间】:2013-02-23 12:04:38
【问题描述】:

我确定之前有人问过这个问题,所以我当然使用搜索功能来检查是否有答案可以解决我的问题。

但是,我能找到的只是很多关于高精度测量时间的答案。

我需要的是一个高分辨率(至少毫秒)的计时器,它允许我在经过定义的时间段时触发回调。 我想在 Cocoa Mac OS X 应用程序中使用它,所以 C/C++ 或 Obj-C 是可能的。 如果需要额外的库,那也可以。

我找到了这个http://www.songho.ca/misc/timer/timer.html,但它使用了繁忙的等待策略,并且我认为会花费太多的性能。

非常感谢您的帮助!

【问题讨论】:

  • 我不了解 Cocoa,但你应该阅读更多关于它的事件循环机制的信息;它肯定会给你一些计时器或轮询......你基本上应该了解如何注册超时事件回调。
  • 这个问题似乎有你的答案:stackoverflow.com/questions/464618/…(第二个答案:在 OSX 上,mach_absolute_time 和 mach_timebase_info 是 Win32 QueryPerformance* 函数的最佳等价物。)
  • std::this_thread::sleep_for 浮现在脑海中(因为我昨天碰巧又偶然发现了它),例如,与std::milliseonds 一起使用(不确定那里是否应该有“chronos”或其他东西,检查出来)。哦,还有 C++11 中的所有“未来”支持。可惜我没用过。
  • @guitarflow 你也有精度/抖动要求吗?
  • 嗯,在 posix 系统上的 C 中执行此操作的传统方法是使用 timer_create 和信号。

标签: c++ objective-c c timer callback


【解决方案1】:

您可以使用的一项伟大技术直接来自 Apple。定时器调度来源:

http://developer.apple.com/library/mac/#documentation/General/Conceptual/ConcurrencyProgrammingGuide/GCDWorkQueues/GCDWorkQueues.html

阅读它需要一些时间,但是一旦你得到它,它就很容易使用。您可以指定以纳秒为单位的时间间隔,以及应定期执行的块。

它是 GCD 技术的一部分,并且是基于 C 的。由于 Objective-C 只是 C 加上一些附加内容,因此坚持使用 C 似乎更自然。进入 C++,因此在这种情况下,Objective-C++ 似乎是一种矫枉过正。

【讨论】:

  • 这看起来棒极了!不知道 GCD 也可以做到这一点!感谢您的回答!
  • 这应该在搜索结果中提升以进行精确的 Cocoa 计时器搜索。这太棒了。
【解决方案2】:

您可以直接从 Apple 使用 GCD。在 Mac OS X 上,GCD 从 v10.7 开始可用。

double delayInMilliseconds = 100.0;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInMilliseconds * NSEC_PER_MSEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
    // callback invocation
});

【讨论】:

  • 完美!谢谢。会调查的。
【解决方案3】:

也许你可以使用加速计时器,

http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/tutorial/tuttimer2.html,教程给出了秒的例子,但你也可以使用毫秒,即使用下面..

boost::posix_time::毫秒(...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-02
    • 2011-10-31
    相关资源
    最近更新 更多