2009-05-15 10 views
6

Intéressé par quelque chose de similaire à JavaScript setTimeout en C sous UNIX et Windows.C Timer Callback

Fondamentalement, je veux:

start_timer(&function_pointer, int time_in_secs) 

ou proche de celui que je peux obtenir.

En outre, quelque chose de similaire à setInterval serait bien (où il appelle le rappel toutes les secondes n), mais qui peut être mis en œuvre en utilisant setTimeout :)

+0

Je ne peux pas accepter deux réponses, et j'avoir des réponses séparées pour Unix et Windows. Je pourrais utiliser SDL, mais les réponses ici sont bien. Je vais juste accepter les fenêtres parce qu'il n'y a qu'une seule personne qui a répondu à cette partie. – singpolyma

Répondre

8

SetTimer dans Win32 avec un TimerProc comme rappel.

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

Pour UNIX, man setitimer.

1

Quelques informations sur l'alarme sont disponibles() et setitimer() here. Notez que la fonction upcall est un gestionnaire de signal, elle est donc soumise à toutes les limitations et restrictions associées aux gestionnaires de signaux, comme décrit en détail here.

Comme indiqué dans le premier lien, alarm() est basé sur POSIX, setitimer() ne l'est pas (bien qu'il soit plus flexible).

+0

La spécification POSIX actuelle indique que setitimer() et getitimer() sont obsolètes et peuvent être supprimés dans une future édition. Les remplacements recommandés sont timer_gettime() et timer_settime(). –

+0

@Jonathan, vous avez raison, il semble que le document glibc est incorrect (ou du moins trompeur) en ce qui concerne setitimer()/getitimer() étant des interfaces non-POSIX. Est-ce que quelque chose de plus récent que la version 2004 de 1003.1 est disponible en ligne? Le meilleur que j'ai pu trouver était ici: http://www.unix.org/single_unix_specification/. –

+0

Spécifications de la base Open Group Édition 7 IEEE Std 1003.1 ™ -2008 à l'adresse http://www.opengroup.org/onlinepubs/9699919799/toc.htm –

5

Vous pourriez vouloir essayer les compteurs d'intervalle Posix, timer_create et timer_settime, car il vous permet de spécifier des fonctions callback directement, sans l'aide de signaux. Pour obtenir la minuterie expire juste une fois (et non ne cessent de répéter):

timer_settime: La valeur de rechargement de la minuterie doit être réglée sur la valeur spécifiée par le membre it_interval de la valeur . Lorsqu'un temporisateur est armé d'un temporisateur non nul, un temporisateur périodique (ou ) est spécifié.

Voici une documentation complète sur l'utilisation de ces compteurs avec un bel exemple du manuel du programmeur Linux sur kernel.org:

timer_create - create a POSIX per-process timer