www.mikrocontroller.net

Forum: PC-Programmierung Timer in C


Autor: Chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LPTIMECALLBACK MyTimerProc () ...

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

Autor: JojoS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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=...

und hier ist auch ein Beispiel:
http://msdn.microsoft.com/library/default.asp?url=...

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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):
#include <stdio.h>
#include <conio.h>
#include <windows.h>

extern "C"
{
        void CALLBACK fPeriodic(UINT wTimerID, UINT msg,
                                DWORD dwUser, DWORD dw1,
                                DWORD dw2);
}

int
main(void)
{
        timeSetEvent(500, 100, fPeriodic, 0, TIME_PERIODIC);

        while(getch() != ' ')
                ;

        printf("\r\n-- Program exits normally.\r\n");
        
        return 0;
}

void CALLBACK fPeriodic(UINT wTimerID, UINT msg,
                        DWORD dwUser, DWORD dw1,
                        DWORD dw2)
{
        printf("%s: TIMEREVENT!\r\n", __FUNCTION__);
}

Kompilieren mit:

  $ g++ -O -ggdb -o main.exe main.c -Wl,-lwinmm

Das Programm lässt sich mit [SPACE] beenden.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.