Mahlzeit, ich möchte einen Timer in C programmieren. Hierzu habe ich bei Microsoft die Funktion timeSetEvent() gefunden. Nun möchte ich "einfach" dass mein Timer jede Sekunde in eine Funktion springt und diese ausführt. Mein Quellcode: #include <stdio.h> #include <stdlib.h> #include <windows.h> void MyTimerProc(); int timer=0; int main(int argc, char *argv[]) { timeSetEvent(1000,100,MyTimerProc(), 0, TIME_CALLBACK_FUNCTION); system("PAUSE"); //return 0; } void MyTimerProc() { timer++; printf("Timer: %d \n",timer); } Als Fehlermeldung erhalte ich "invalid use of void expression". Wer kann mir weiterhelfen bzw. gehe ich die Sache schon von vornherein falsch an? Gruß Chris
LPTIMECALLBACK MyTimerProc () ... So steht es zumindest in der MSDN, welche du auch nutzen solltest.
die Callback Funktion bekommt noch Argumente mit, deine MyTimerProc() ist nicht korrekt. Siehe die MS-Hilfe, http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_timesetevent.asp und hier ist auch ein Beispiel: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_using_multimedia_timers.asp
Wenn das C sein soll, dann darf außerdem das Argiment der Funktion MyTimerProc weder im Prototypen noch in der Implementierung leer sein - so etwas erlaubt erst C++. Wenn Du einer Funktion nichts übergeben möchtest, musst Du ihre Argumentenliste explizit mit void kennzeichnen. Also: void MyTimerProc(void); Das dürfte zumindest die Ursache der beschriebenen Fehlermeldung sein. Damit läuft Dein Programm aber nicht, denn der Hinweis von JoJoS ist auch noch zu beachten; die Callback-Funktion, die Du mit timeSetEvent anmelden kannst, bekommt sehr wohl Argumente übergeben.
Btw.: Erstmal danke für eure Infos ;) Ich habe das ganze mal mit dem gcc ausprobiert (ich verwende den C++ Compiler, weil in der eigentlichen Applikation eine C++-Lib verwendet wird):
1 | #include <stdio.h> |
2 | #include <conio.h> |
3 | #include <windows.h> |
4 | |
5 | extern "C" |
6 | {
|
7 | void CALLBACK fPeriodic(UINT wTimerID, UINT msg, |
8 | DWORD dwUser, DWORD dw1, |
9 | DWORD dw2); |
10 | }
|
11 | |
12 | int
|
13 | main(void) |
14 | {
|
15 | timeSetEvent(500, 100, fPeriodic, 0, TIME_PERIODIC); |
16 | |
17 | while(getch() != ' ') |
18 | ;
|
19 | |
20 | printf("\r\n-- Program exits normally.\r\n"); |
21 | |
22 | return 0; |
23 | }
|
24 | |
25 | void CALLBACK fPeriodic(UINT wTimerID, UINT msg, |
26 | DWORD dwUser, DWORD dw1, |
27 | DWORD dw2) |
28 | {
|
29 | printf("%s: TIMEREVENT!\r\n", __FUNCTION__); |
30 | }
|
Kompilieren mit: $ g++ -O -ggdb -o main.exe main.c -Wl,-lwinmm Das Programm lässt sich mit [SPACE] beenden.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.