2013-02-23 33 views
5

我确定这个问题之前已经被问过了,所以我当然使用搜索功能来检查是否有解决我的问题的答案。带回调的ObjC/C/C++高分辨率定时器

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

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

我发现这个http://www.songho.ca/misc/timer/timer.html,但它使用繁忙的等待策略,并会花费我假设的太多性能。

非常感谢帮助!

+3

C或C++?选一个。 – 2013-02-23 12:06:00

+0

我不知道可可,但你应该多了解它的事件循环机制;它肯定会给你一些定时器或轮询....你基本上应该找出如何注册一个超时事件回调。 – 2013-02-23 12:10:54

+0

这个问题似乎有你的答案:http://stackoverflow.com/questions/464618/whats-the-equivalent-of-windows-queryperformancecounter-on-osx(第二个答案:在OSX上mach_absolute_time和mach_timebase_info是最好的等价物Win32 QueryPerformance *函数。) – 2013-02-23 12:14:05

回答

6

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

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

这将需要一段时间来阅读,但一旦你得到它,它很容易使用。您可以指定纳秒时间间隔以及应该定期执行的块。

它是GCD技术的一部分,它基于C语言。由于Objective-C只是C以及一些附加功能,因此只需坚持使用C就会更自然。进入C++,因此Objective-C++在这种情况下似乎是一种矫枉过正。

+0

这看起来很棒!不知道GCD也可以做到这一点!感谢你的回答! – guitarflow 2013-02-23 13:13:38

+0

这应该在精准可可定时器搜索的搜索结果中提升。这太棒了。 – uchuugaka 2013-07-17 06:31:10

6

您可以直接从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 
}); 
+0

完美!谢谢。将研究它。 – guitarflow 2013-02-23 13:14:14