2009-05-15 11 views
6

Zainteresowany czymś podobnym do JavaScript setTimeout w C zarówno w UNIX, jak i Windows.C Czas oddzwonienia

Zasadniczo chcę:

start_timer(&function_pointer, int time_in_secs) 

lub tak blisko, że jak mogę.

też coś podobnego do setInterval byłoby miło (gdzie wywołuje zwrotnego co n sekund), ale to może być realizowane za pomocą setTimeout :)

+0

nie mogę przyjąć dwie odpowiedzi i mam oddzielne odpowiedzi na Unix i Windows. Mógłbym używać SDL, ale tutaj odpowiedzi są w porządku. Po prostu zaakceptuję okna jeden, ponieważ tylko jedna osoba odpowiedziała na tę część. – singpolyma

Odpowiedz

8

SetTimer w Win32 z TimerProc jako oddzwonić.

/* calls TimerProc once every 60000 milliseconds */ 
SetTimer(NULL, 1, 60000, TimerProc); 
2

dla systemu UNIX, man setitimer.

1

Niektóre informacje o alarmie() i setitimer() można znaleźć here. Zwróć uwagę, że funkcja upcall jest procedurą obsługi sygnału, więc podlega wszystkim ograniczeniom i ograniczeniom związanym z procedurami obsługi sygnałów, jak opisano szczegółowo pod tym numerem: here.

Jak zauważono w pierwszym łączu, alarm() jest oparty na POSIX, setitimer() nie jest (chociaż jest bardziej elastyczny).

+0

Bieżąca specyfikacja POSIX mówi, że setitimer() i getitimer() są przestarzałe i mogą zostać usunięte w przyszłej edycji. Zalecanymi zamiennikami są timer_gettime() i timer_settime(). –

+0

@ Jonathan, masz rację, wygląda na to, że dokumentacja glibc jest niepoprawna (lub przynajmniej wprowadzająca w błąd) w związku z tym, że setitimer()/getitimer() jest interfejsem innym niż POSIX. Czy jest dostępna nowsza wersja niż wersja 1003,1 w wersji 2004? Najlepsze, co mogłem znaleźć, to: http://www.unix.org/single_unix_specification/. –

+0

Specyfikacja podsta wowa dla grupy otwartej Issue 7 IEEE Std 1003.1 ™ -2008 na http://www.opengroup.org/onlinepubs/9699919799/toc.htm –

5

Może chcesz spróbować POSIX interwał liczniki, timer_create i timer_settime, gdyż pozwala na określenie funkcji oddzwaniania bezpośrednio bez użycia sygnałów. Aby uzyskać timer wygaśnie tylko raz (a nie powtarzać):

timer_settime: wartość reload zegar zostanie ustawiony na wartość określonym przez it_interval członek wartości. Gdy timer jest uzbrojony w niezerowy it_interval, okreslony jest okresowy (lub powtarzalny) zegar czasowy .

Oto obszerna dokumentacja z użyciem tych timerów z ładnym przykład z podręcznika programisty Linux na kernel.org:

timer_create - create a POSIX per-process timer