Windows的SetTimer的Cocoa对应物

时间:2009-09-25 11:32:29

标签: c++ cocoa timer

在Windows中,OS X上的SetTimer是否有任何等效功能?我正在使用C ++。

所以我正在为一些软件编写一个插件,我需要定期调用一个函数。在Windows上,我只是将函数的地址传递给SetTimer(),它将以给定的间隔调用。 在OS X上有一个简单的方法吗? 它应该尽可能简约。我在网上找不到任何不合适的东西,有一个关于庞大框架的东西,另一个解决方案是使用另一个正在休息的第二个线程,但我认为应该有一个更简单的方法。

6 个答案:

答案 0 :(得分:4)

在Cocoa中,典型的调用是这样的;

NSTimer *repeatingTimer=  [NSTimer scheduledTimerWithTimeInterval:timeIntervalInSecs target:objectImplementingFunction selector:@selector(nameOfYourFunction:) userInfo:argToYourFunction repeats:YES];

导致计时器被放置在当前的runloop上。只要计时器触发,它就会调用你的功能。

如果您以后想要取消定时器调用

[repeatingTimer invalidate];

将其从runloop中删除。

答案 1 :(得分:2)

查看NSTimer课程。

答案 2 :(得分:1)

如果您想要简单,那么您只需使用alarm()

SIGALRM设置信号处理程序,然后调用alarm()以要求操作系统在延迟后生成信号。有一个例子here

答案 3 :(得分:1)

考虑使用Boost Asio library。班级deadline_timer适用于所有平台。只需使用bind将功能附加到async_wait并致电expires_from_now

io_service io;
deadline_timer timer(io);

void handler()
{
    static int second_counter = 0;
    cout << second_counter++ << endl;

    timer.expires_from_now(posix_time::seconds(1));    
    timer.async_wait(bind(&handler));
}

int main(int argc, char* argv[])
{
    handler();

    io.run();
}

要花一点时间来了解Asio(尤其是因为文档是......不完整的)但是非常值得学习。

答案 4 :(得分:0)

我的页面上有一些小教程

http://cocoa-coding.de/timer/nstimer.html

仅限德语,但我相信您会理解代码示例。

答案 5 :(得分:0)

Poco C++ library提供了跨平台Timer class