SetTimer in Bedingung
-
Hallo,
Ich habe folgende Klasse geschrieben (hier nur relevanter Code).
Klasse.h
# define TryReconnectInterval 1000 class Klasse { private: bool TimerReconnectEnabled; void EnableTimerReconnect(); void TryReconnect(); DWORD TimerIDReconnect; static void CALLBACK TryReconnectCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime); ... ... }Klasse.cpp
void CALLBACK Klasse::TryReconnectCallback(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime) { printf("Test %i", 1); } void Klasse::EnableTimerReconnect() { if(TimerReconnectEnabled) { } else { TimerReconnectEnabled = true; TimerIDReconnect = SetTimer(NULL, NULL, TryReconnectInterval, TryReconnectCallback); } }Das Programm erzeugt den Timer (Breakpoint gesetzt), jedoch wird so die Callback Funktion nie aufgerufen. Wenn ich die Funktion SetTimer nicht in der Bedingung aufrufe, wird die Callback Funktion wie erwartet jede Sekunde aufgerufen.
void Klasse::EnableTimerReconnect() { TimerIDReconnect = SetTimer(NULL, NULL, TryReconnectInterval, TryReconnectCallback); if(TimerReconnectEnabled) { } else { TimerReconnectEnabled = true; } }Woran liegt das? Habe ich etwas übersehen?
Vielen DankGrüsse
-
vll die reihenfolge von
TimerReconnectEnabled = true;und
TimerIDReconnect = SetTimer(NULL, NULL, TryReconnectInterval, TryReconnectCallback);
-
Wird TimerReconnectEnabled überhaupt irgendwo initialisiert?
-
Hallo,
Diese Antwort habe ich jetzt leider nicht verstanden...
Habs mal so probiert und es kommt das selbe raus:void Klasse::EnableTimerReconnect() { if(TimerReconnectEnabled) { } else { TimerIDReconnect = SetTimer(NULL, NULL, TryReconnectInterval, TryReconnectCallback); TimerReconnectEnabled = true; } }TimerReconnectEnabled wird im Konstruktor initialisiert. Und wie schon gesagt, der Programmteil wird erreicht (Breakpoint gesetzt)!!!
Grüsse
-
Ist Dir klar, dass Deine Callback-Funktion _statisch_ ist, Du aus dieser Callback also keinen Zugriff auf die Instanz Deiner Klasse hast, welche den Timer initialisiert hat?
-
Hallo,
Vielen Dank für den Hinweis. Das habe ich auch gemerkt, aber die Callback Funktion muss statisch sein so wie ich das verstanden habe. Wenn ich jetzt auf meine Klasse zugreifen möchte muss ich einen globalen Klassenpointer definieren.
Gibt es dazu auch eine bessere Lösung?Grüsse
-
Nur eine Idee, noch nicht ausprobiert:
Schau mal, ob die TimerId in SetTimer an die TimerProc weitergegeben wird, auch wenn kein hWnd gegeben ist (wird aus Doku nicht klar). Falls ja, könntest Du eine statische Liste in Deiner Timer-Klasse anlegen, die beim Aufruf von SetTimer die TimerId und den Zeiger auf die Instanz der Klasse erhält. In der TimerProc kannst Du dann dann die Klasseninstanz anhand der TimerId aus der Liste holen (einfach drauf casten).
-
Hallo,
Diese Idee hatte ich auch schon, aber wie es in der Doku steht, wird dieser Parameter ignoriert und auch nicht weitergegeben wenn hWnd = NULL.
Grüsse