Timer in C

Gast #249644
Lesenswert?

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
Persönliche Seite #249647
Lesenswert?

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.
Persönliche Seite #249648
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren