Timer in Klasse?



  • Hallo,

    ich möchte verschiedene Instanzen einer Klasse erstellen, die jeweils einen Timer besitzen. Eine CALLBACK-Funktion (also TIMERPROC) kann man ja wie ich gelesen habe in Klassen nicht verwenden. Aber ich möchte die Klasse so einfach wie möglich gestalten und nicht, dass der Anwender noch in den Main-Loop bei WM_TIMER etwas eingeben muss. Kann man das trotzdem irgendwie hinbekommen?

    Danke



  • Du kannst CreateTimerQueueTimer verwenden. Den timerhandle kannst du in dein Timerobjekt speichern und DeleteTimerQueueTimer in den Destruktor packen. Als Parameter nimmst du einen Pointer auf dein Timerobjekt und als CALLBACK Funktion einfach

    void CALLBACK TimerClassCallback(void *Parameter, int TimerOrWaitFired){
      ((TimerClass *)Parameter)->callback();
    }
    

    benutzen.
    Funktioniert ohne Message Loop / Main Loop.
    Vielleicht kann man TimerClassCallback auch als statische Funktion in die Klasse schreiben.



  • Vielen Dank, damit habe ich es geschafft! Also im Konstruktor habe ich jetzt

    hTimer = NULL;
    	hTimerQueue = CreateTimerQueue();
    	CreateTimerQueueTimer( &hTimer, hTimerQueue, (WAITORTIMERCALLBACK)TimerRoutine, &wavepointer , 0, 1000, 0);
    

    &wavepointer ist ein Pointer auf meine Klasse, also in der Headerdatei:

    WAVEPOINTER *wavepointer;
    

    und

    HANDLE hTimer;
    	HANDLE hTimerQueue;
    
    void callback();
    static VOID CALLBACK TimerRoutine(PVOID *lpParam, BOOLEAN TimerOrWaitFired);
    

    und die Callback-Funktion ist

    VOID CALLBACK WAVEPOINTER::TimerRoutine(PVOID *lpParam, BOOLEAN TimerOrWaitFired){
    	((WAVEPOINTER *)lpParam)->callback();
    };
    

    Es funktioniert bisher. Ist das alles so auch recht sauber programmiert? Muss ich unbedingt im Destruktor DeleteTimerQueueTimer schreiben? Es funktioniert bisher auch ohne. Zur Laufzeit werden keine Objekte von meiner Klasse zerstört. Ich bin noch Anfänger in C++ 😉

    Jedenfalls vielen Dank!



  • Solange keine Objekte der Klasse zerstört werden ist es wohl egal was im Destruktor steht. C++ hat aber die Angewohnheit selbst mal Destruktoren zu rufen, zum Beispiel wenn in einem Konstruktor ein Objekt deiner Klasse erzeugt wird, dann aber was schief geht. Wenn das passiert wird wahrscheinlich die Callback-Funktion abstürzen. Des guten Stils wegen würde ich einen vernünftigen Destruktor schreiben oder wenigstens raise "not implemented"; in den Destruktor schreiben, damit man den Fehler bemerkt und nicht einfach nur einen Segfault sieht.


Anmelden zum Antworten