Forum: PC-Programmierung Timer in C


von Chris (Gast)


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

von Alex (Gast)


Lesenswert?

LPTIMECALLBACK MyTimerProc () ...

So steht es zumindest in der MSDN, welche du auch nutzen solltest.

von JojoS (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Patrick D. (oldbug) Benutzerseite


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.

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
Noch kein Account? Hier anmelden.