TimerTask für C++



  • Suche ne Bibliothek/Klasse in C++, die zeitgesteuert Aufrufe durchführt. Ähnlich Timer/TimerTask in Java. Gibt's was fertiges oder muss ich selber bauen?



  • hier ein beispiel:

    #include <windows.h>
    #include <stdio.h>
    
    typedef void (*TIMEDFUNC)(void *p);
    
    typedef struct __TIMER
    {
      TIMEDFUNC f;
      void *param;
      DWORD delay;
      volatile int running;
    } TIMER;
    
    void TimerThread (TIMER *t)
    {
        while (t->running)
        {
           Sleep(t->delay);
           t->f(t->param);
        }
        t->running = 1; 
    }
    
    TIMER *TimerCreate (DWORD delay, TIMEDFUNC f, void *param)
    {
       TIMER *t = malloc (sizeof(TIMER));
       t->f = f;
       t->delay = delay;
       t->running = 1;
       t->param = param;
       _beginthread (TimerThread, 0, t);     
       return t;
    } 
    
    void TimerDestroy (TIMER *t)
    {
       printf ("Killing Task %d\n", t->param);
       t->running = 0;
       while (!t->running)
         Sleep(10);
       printf ("Task %d is gone away\n", t->param);
       free (t);     
    }
    
    void TestFunc (void *p)
    {
        printf ("Hello Task %d\n", p);        
    }
    
    int main()
    {
        TIMER *t1;
        TIMER *t2;
        TIMER *t3;
    
        t1 = TimerCreate (1000, TestFunc, 1);
        t2 = TimerCreate (1500, TestFunc, 2);
        t3 = TimerCreate (1300, TestFunc, 3);
    
        Sleep (5000);
        TimerDestroy (t1);
        Sleep (5000);
        TimerDestroy (t2);
        Sleep (5000);
        TimerDestroy (t3);
    
        getchar();
    }
    

    läuft so wie's ist unter windows und dev-cpp
    msvc sollte es aber auch schlucken



  • Danke. Hoffe Du hast den Code nicht extra geschrieben. Mir gehts wirklich darum, ob's nicht ne Bibliothek gibt.

    Ich versuche inzwischen ganz bewusst, nicht immer das Rad wieder neu zu erfinden sondern wo es geht, fertige, ausgetestete Bibs zu verwenden. Wie es in Java üblich ist. Es gibt ja ziehmlich viel für C++ die Frage ist immer nur: wo? Natürlich ist deswegen in C++ die Zeit, die Bib zu suchen, oft höher, als es selber zu schreiben. Aber meistens bieten die Bibs dann ja auch mehr als man grade brauch und man hat was für die Zukunft.

    Als Standard-Bibs verwende ich boost, ace und stlPlus. Oberflächen mach ich nicht mehr so viel 🙂



  • kartoffelsack schrieb:

    Danke. Hoffe Du hast den Code nicht extra geschrieben.

    ne, nur ca. 4 zeilen. das stammt aus meiner privaten snippet collection



  • schau dir mal boost an, da sind viele gute Librarys dabei.
    Unter anderem auch boost::timer.



  • Soweit ich informiert bin, ist boost/timer nur zum Zeitmessen oder für solche Sachen wie Fortschrittsbalken da:

    timer: Measure elapsed time.
    progress_timer: Measure elapsed time (using timer), display on destruction.
    progress_display: Display an indication of progress toward a known goal.

    Ich bräuchte was, das eine Aktion nach einer bestimmten Zeit auslöst.



  • Kannst du nicht einfach einen Thread laufen lassen der immer nachschaut wieviel Zeit vergangen ist und dann was ausführt, wenn es soweit ist? Würde dafür boost::thread, boost::date_time und boost::signal nehmen. Besser wäre es natürlich, wenn es ein boost::task geben würde. 😉



  • doch, kann ich. Mach ich inzwischen auch. Aber wie gesagt ...

    Naja, könnt das ja alles ganz schön machen und für boost vorschlagen 😉


Anmelden zum Antworten