2009-09-25 2 views
2

Есть ли эквивалентная функция в OS X для SetTimer в Windows? Я использую C++.Какао-копия Windows 'SetTimer

Так что я пишу плагин для некоторого программного обеспечения, и мне нужно периодически вызывать функцию. В Windows я просто передаю адрес функции SetTimer(), и он будет вызываться с заданным интервалом. Есть ли простой способ сделать это на OS X? Он должен быть максимально минимальным. Я действительно не нашел в Интернете ничего необычного, было что-то в огромной структуре и другом решении, использующем второй поток, который спят в другой раз, но я думаю, что должен быть более простой способ.

ответ

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 (тем более, что документация ... пятнистый), но это хорошо стоит учиться.

+0

Хм, не совсем понимаю рейтинг 0 (хотя я благодарен, что ответ был принят!)? Автор явно упомянул, что они использовали C++ (а не Cocoa, как и некоторые из полученных ответов), и это лучший способ узнать таймер на этом языке ... – MattyT

1

Если вы хотите простоту, которой вы просто не пользуетесь alarm()?

Установите обработчик сигнала для SIGALRM, а затем позвоните alarm(), чтобы попросить ОС сгенерировать сигнал после задержки. Пример: here.

4

В Какао типичный вызов происходит примерно так:

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

, который вызывает включение таймера в текущей рабочей точке. Всякий раз, когда срабатывает таймер, он вызывает вашу функцию.

Если позже вы хотите, чтобы отменить вызов таймера

[repeatingTimer invalidate]; 

, который удаляет его из runloop.

Смежные вопросы