Like Tree1Danke
  • 1 Beitrag von sheel
ERLEDIGT
JA
ANTWORTEN
9
ZUGRIFFE
3510
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
  1. #1
    Clund ist offline (aka Cpp-Freak)
    Registriert seit
    Mar 2010
    Ort
    Neuburg a. D.(Bayern)
    Beiträge
    124
    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
     
    Früherer Name: Cpp-Freak
    Bildung ist, was übrig bleibt, wenn man alles vergessen hat, was man in der Schule gelernt hat
    -Albert Eistein
    Wirklich, ich habe nicht vor Microsoft zu zerstören. Das wird nur ein ziemlich unbeachteter Nebeneffekt sein
    -Linus Torvalds
    Die meisten Computerpobleme sitzen zwischen Tastatur und Stuhl

    Google ist dein Freund

  2. #2
    Avatar von sheel
    sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    6.723
    Hi

    Verschiedene Frameworks haben sowas, oder sonst einen einfachen Thread.
    Sowas:
    Code cpp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    
    struct timerstruct
    {
        void (*func)(void *);
        void *param;
        unsigned int ms;
    };
    void timerth(void *p)
    {
        Sleep(((struct timerstruct *)p)->ms);
        ((struct timerstruct *)p)->f(((struct timerstruct *)p)->param);
        free(p);
    }
    void starttimer(int ms, void (*funktion)(void *), void *funktionsparameter)
    {
        struct timerstruct *p;
        p = (struct timerstruct *)malloc(sizeof(struct timerstruct));
        p->func = funktion;
        p->param = funktionsparameter;
        p->ms = ms;
        _beginthread(p);
    }
    //...
    void meinefunktion(void *meinparameter)
    {
    }
    //...
    char c[1024];
    starttimer(1000, meinefunktion, c); //1 Sekunde
    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ß
    Clund bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    Clund ist offline (aka Cpp-Freak)
    Registriert seit
    Mar 2010
    Ort
    Neuburg a. D.(Bayern)
    Beiträge
    124
    Danke für die schnelle Antwort,
    wofür brauchst du "timerth"?
    Clund
     

  4. #4
    Avatar von saftmeister
    saftmeister ist offline Nutze den Saft!
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    4.577
    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.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    Clund ist offline (aka Cpp-Freak)
    Registriert seit
    Mar 2010
    Ort
    Neuburg a. D.(Bayern)
    Beiträge
    124
    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
     
    Früherer Name: Cpp-Freak
    Bildung ist, was übrig bleibt, wenn man alles vergessen hat, was man in der Schule gelernt hat
    -Albert Eistein
    Wirklich, ich habe nicht vor Microsoft zu zerstören. Das wird nur ein ziemlich unbeachteter Nebeneffekt sein
    -Linus Torvalds
    Die meisten Computerpobleme sitzen zwischen Tastatur und Stuhl

    Google ist dein Freund

  6. #6
    Avatar von sheel
    sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    6.723
    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
    Generell sollte man die Hauptschleife aber für die Animation lassen
    und den Rest in Threads auslagern. Macht weniger Probleme.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  7. #7
    Clund ist offline (aka Cpp-Freak)
    Registriert seit
    Mar 2010
    Ort
    Neuburg a. D.(Bayern)
    Beiträge
    124
    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. #8
    Clund ist offline (aka Cpp-Freak)
    Registriert seit
    Mar 2010
    Ort
    Neuburg a. D.(Bayern)
    Beiträge
    124
    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
     
    Früherer Name: Cpp-Freak
    Bildung ist, was übrig bleibt, wenn man alles vergessen hat, was man in der Schule gelernt hat
    -Albert Eistein
    Wirklich, ich habe nicht vor Microsoft zu zerstören. Das wird nur ein ziemlich unbeachteter Nebeneffekt sein
    -Linus Torvalds
    Die meisten Computerpobleme sitzen zwischen Tastatur und Stuhl

    Google ist dein Freund

  9. #9
    Clund ist offline (aka Cpp-Freak)
    Registriert seit
    Mar 2010
    Ort
    Neuburg a. D.(Bayern)
    Beiträge
    124
    nächstes Problem: nachdem ich mein Programm weiter geschrieben habe (von Thread, ... abgeleitet), gibt mir der Computer eine Fehlermeldung aus:
    Code :
    1
    2
    3
    4
    5
    
    X Error of failed request:  BadAccess (attempt to access private resource denied)
      Major opcode of failed request:  153 (GLX)
      Minor opcode of failed request:  26 (X_GLXMakeContextCurrent)
      Serial number of failed request:  52
      Current serial number in output stream:  52
    Der Code, der dies verursacht ist:
    Code :
    1
    
    Fenster.draw();
    Fenster ist ein sfml-Window, als private deklariert, hat auch schon funktioniert, public hilft leider nicht.
    Clund
    Miniaturansicht angehängter Grafiken Miniaturansicht angehängter Grafiken Event Timer in C/C++?-bildschirmfoto-5.png  
     
    Früherer Name: Cpp-Freak
    Bildung ist, was übrig bleibt, wenn man alles vergessen hat, was man in der Schule gelernt hat
    -Albert Eistein
    Wirklich, ich habe nicht vor Microsoft zu zerstören. Das wird nur ein ziemlich unbeachteter Nebeneffekt sein
    -Linus Torvalds
    Die meisten Computerpobleme sitzen zwischen Tastatur und Stuhl

    Google ist dein Freund

  10. #10
    deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.731
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

Ähnliche Themen

  1. Timer im Timer
    Von binderj1 im Forum .NET Café
    Antworten: 9
    Letzter Beitrag: 30.12.10, 07:07
  2. mousup-event erzeugt vorher paint-event.Wie abstellen?
    Von Cheesygecko im Forum .NET Windows Forms
    Antworten: 0
    Letzter Beitrag: 09.01.09, 14:04
  3. Event in Event aufrufen
    Von warcraft9105 im Forum .NET Windows Forms
    Antworten: 6
    Letzter Beitrag: 24.04.08, 10:00
  4. Timer in C
    Von DerJens im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 06.09.04, 15:03

Stichworte