1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Event Timer in C/C++?

Dieses Thema im Forum "C/C++" wurde erstellt von Clund, 2. Mai 2012.

  1. Clund

    Clund (aka Cpp-Freak)

    Hallo zusammen,
    ich wüsste gerne, ob es eine Timerfunktion in C/C++ gäbe, für Linux. So änlich wie die in Java (java.util.timer).
    Am besten wäre, wenn man dem Timer eine Funktion übergeben könnte, die dann dem Zeitintervall entsprechend aufgerufen wird.
    Clund
  2. sheel

    sheel Mod # I love Asm Moderator

    Hi

    Verschiedene Frameworks haben sowas, oder sonst einen einfachen Thread.
    Sowas:
    Code (C++):
    1.  
    2. struct timerstruct
    3. {
    4.     void (*func)(void *);
    5.     void *param;
    6.     unsigned int ms;
    7. };
    8. void timerth(void *p)
    9. {
    10.     Sleep(((struct timerstruct *)p)->ms);
    11.     ((struct timerstruct *)p)->f(((struct timerstruct *)p)->param);
    12.     free(p);
    13. }
    14. void starttimer(int ms, void (*funktion)(void *), void *funktionsparameter)
    15. {
    16.     struct timerstruct *p;
    17.     p = (struct timerstruct *)malloc(sizeof(struct timerstruct));
    18.     p->func = funktion;
    19.     p->param = funktionsparameter;
    20.     p->ms = ms;
    21.     _beginthread(p);
    22. }
    23. //...
    24. void meinefunktion(void *meinparameter)
    25. {
    26. }
    27. //...
    28. char c[1024];
    29. starttimer(1000, meinefunktion, c); //1 Sekunde
    30.  
    Das ist jetzt nur schnell hingekritzelt, besserer Pseudocode.
    Hat nirgends Fehlerprüfung, ist nicht kompiliert, nicht getestet.

    Zu beachten: Threadsafezeug in der aufgerufenen Funktion.
    Und Sleep ist nicht wirklich exakt mit den Millisekunden.
    Für die Framerate in einem Spiel oder so ist das damit nicht zu gebrauchen.

    Gruß
  3. Clund

    Clund (aka Cpp-Freak)

    Danke für die schnelle Antwort,
    wofür brauchst du "timerth"?
    Clund
  4. saftmeister

    saftmeister Nutze den Saft! Premium-User

    Hallo,

    auch wenn es vielleicht noch andere oder schönere Lösungen gibt, fällt mir grad nur das ein:

    1. Schleife evtl. auch endlos z.B. mit while(1)
    2. SIGALRM mit eigenem Handler registrieren
    3. alarm()-Funktion benutzen, Anzahl der Sekunden als Parameter übergeben.
    4. Im eigenen Handler die Geschäfslogik implementieren.

    Dieses Beispiel ist aber unter Windows nicht so ohne weiteres umsetzbar, da weder MinGW noch MSVC alarm() oder SIGALRM kennen.

    Grundsätzlich wäre es auch mit fork() oder Threads und sleep() lösbar.
  5. Clund

    Clund (aka Cpp-Freak)

    Achso ja, wofür ich das brauche:
    ich schreib grad nen sfml Projekt und will die Aktualisierung per Timer steuern
    wärenddessen wird ganz unabhängig noch gerechnet
    also kein while(), und keine exakt Abarbeitung ...
    Clund
  6. sheel

    sheel Mod # I love Asm Moderator

    timerth ist der Thread.

    SFML: Genau sowas mein ich mit Framerate=ungeeignet.
    Wenn man den Minicode für die Bildaktualisierung einsetzt bekommt man lustige Sachen,
    aber keine flüssige Animation.

    SFML hat doch schon einen (um einiges besseren) Timer :suchen:
    Generell sollte man die Hauptschleife aber für die Animation lassen
    und den Rest in Threads auslagern. Macht weniger Probleme.
  7. Clund

    Clund (aka Cpp-Freak)

    Gut, muss ich wohl genauer erklären:
    Der Inhalt meiner (erstmal 2D Graphik) soll eine Visualisierung (bzw. Funktionsplotter) für ART und SRT sein. Da brauche ich keine Fließenden Bewegungen.
    Und danke, dass du mich auf den Timer von sfml aufmerksam gemacht hast, ich hab den in nem Testprogramm schon verwendet.
    In der Hauptschleife werden dann (erstmal nur über Konsole) die Terme eingegeben, die dann angezeigt werden.
    ich werde jetzt mal rumprobieren, und mich (in diesem Thread) wieder melden.
    Clund
    Edit: Ich verwende Linux, also saftmeister, das würde ja im Prinzip klappen :)
  8. Clund

    Clund (aka Cpp-Freak)

    meine Lösung:
    die Grafikklasse hab ich von Timer abgeleitet, und die Run() Funktion ruft draw() auf, was wiederum jede Sekunde eine FPS-Statistik ausgibt. d.h. es läuft mit maximaler FPS, derzeit (noch) über 1500 fps
    Clund
  9. Clund

    Clund (aka Cpp-Freak)

    nächstes Problem: nachdem ich mein Programm weiter geschrieben habe (von Thread, ... abgeleitet), gibt mir der Computer eine Fehlermeldung aus:
    Code (Text):
    1. X Error of failed request:  BadAccess (attempt to access private resource denied)
    2.   Major opcode of failed request:  153 (GLX)
    3.   Minor opcode of failed request:  26 (X_GLXMakeContextCurrent)
    4.   Serial number of failed request:  52
    5.   Current serial number in output stream:  52
    6.  
    Der Code, der dies verursacht ist:
    Code (Text):
    1. Fenster.draw();
    Fenster ist ein sfml-Window, als private deklariert, hat auch schon funktioniert, public hilft leider nicht.
    Clund

    Anhänge:

  10. deepthroat

    deepthroat Premium-User

    Hi.

    Ich kenne mich mit SFML nicht aus. Allerdings sind eigentlich alle graf. Nutzerschnittstellen single-threaded und nicht threadsafe, außer es ist explizit angegben.

    Man darf also nicht von unterschiedlichen Threads auf die Grafikroutinen zugreifen.

    Du kannst aber z.B. aufwendige Berechnungen in Threads auslagern und trotzdem auf GUI Ereignisse reagieren.

    Gruß

Diese Seite empfehlen