2009-05-15 7 views
6

Interesse an etwas, das in C sowohl auf UNIX als auch auf Windows ähnlich ist, setTimeout in C.C Timer Callback

Grundsätzlich möchte ich:

start_timer(&function_pointer, int time_in_secs) 

oder so nahe, dass, wie ich bekommen kann.

Auch etwas Ähnliches wie setInterval wäre schön (wo es den Rückruf ruft alle n Sekunden), aber das umgesetzt werden kann mit setTimeout :)

+0

ich nicht zwei Antworten akzeptieren kann, und ich habe separate Antworten Unix und Windows. Ich könnte SDL verwenden, aber die Antworten hier sind in Ordnung. Ich akzeptiere nur das Fenster, weil nur eine Person diesen Teil beantwortet hat. – singpolyma

Antwort

8

SetTimer in Win32 mit einem TimerProc als Rückruf.

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

Für UNIX man setitimer.

1

Einige Informationen über Alarm() und setitimer() kann here finden. Beachten Sie, dass die Upcall-Funktion ein Signal-Handler ist, so dass sie allen Einschränkungen und Einschränkungen unterliegt, die mit den Signalhandlern verbunden sind, wie sie im Detail beschrieben sind here.

Wie im ersten Link erwähnt, ist alarm() POSIX-basiert, setitimer() nicht (obwohl es flexibler ist).

+0

Die aktuelle POSIX-Spezifikation besagt, dass setitimer() und gatitimer() veraltet sind und möglicherweise in einer zukünftigen Edition entfernt werden. Die empfohlenen Ersetzungen sind timer_gettime() und timer_settime(). –

+0

@ Jonathan, Sie haben Recht, es sieht so aus, als wäre das glibc doc falsch (oder zumindest irreführend) in Bezug auf settimer()/getitim() als Nicht-POSIX-Schnittstellen. Ist etwas Neueres als die Version von 1003.1 von 2004 online verfügbar? Das Beste, was ich finden konnte, war hier: http://www.unix.org/single_unix_specification/. –

+0

Die Open Group Base Spezifikationen Ausgabe 7 IEEE Std 1003.1 ™ -2008 unter http://www.opengroup.org/onlinepubs/9699919799/toc.htm –

5

Vielleicht möchten Sie die POSIX-Intervall-Timer, timer_create und timer_settime versuchen, wie es Ihnen eine Anruffunktion ohne Verwendung von Signalen direkt zurück zu spezifizieren. Um die Timer nur einmal ablaufen (und nicht immer wiederholen):

timer_settime: Der Reload-Wert von der Timer wird vom it_interval Mitglied angegebenen Wert auf den Wert eingestellt werden. Wenn ein Timer mit einem ungleich Null it_interval aktiviert wird, wird ein periodischer (oder repetitiver) Timer angegeben.

Hier ist eine umfangreiche Dokumentation dieser Timer mit einem schönen Beispiel aus der Bedienungsanleitung des Linux-Programmierer mit auf kernel.org:

timer_create - create a POSIX per-process timer