Timer in einem Thread starten
-
Hallo.
Ich versuche gerade in einem Thread mit SetTimer einen Timer zu erzeugen, der in eine CallBack Funktion springt. Außerhalb des Threads funktioniert dies problemlos, im Thread leider nicht. Muss ich an der CallBack Funktion irgendwas anpassen?
Vielen Dank im Voraus.
// timer.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include <windows.h> #include <process.h> void CALLBACK TimerProc(HWND, UINT, UINT, DWORD); unsigned _stdcall Thread(void*); void timerinit(); BOOL ThreadRunning=FALSE; UINT TimerId=0; int _tmain(int argc, _TCHAR* argv[]) { HANDLE hThread; UINT ThreadId; hThread = (HANDLE)_beginthreadex(NULL,0,Thread,NULL,0,&ThreadId); if(hThread == NULL) printf("Error creating Thread!\n"); MessageBox(NULL, _T("Click OK to abort."),_T("Timer"),MB_OK); ThreadRunning = FALSE; WaitForSingleObject(hThread,INFINITE); return 0; } void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime) { printf("I am the Timer\n"); } void timerinit() { printf("Starting timer\n"); TimerId = SetTimer(NULL,0,5000,(TIMERPROC)TimerProc); } unsigned _stdcall Thread (void* n) { int i=0; printf("Thread started\n"); ThreadRunning=TRUE; timerinit(); while(ThreadRunning) { i++; } KillTimer(NULL, TimerId); return 0; }
-
Die *Windows*-Timer funktionieren nur, wenn Du auch eine Windows-Message-Pump hast...
In einem Thread ohne eine MessagePunpt geht das dann nicht...ich verstehe aber nicht warum Du einen Timer willst, wenn Du eh einen Thread hast und auch dort direkt via "Sleep(5000)" einen "Timer" hättest...
Alternativ schau Dir CWinThread bzw. Multimedia Timers an.
-
Hallo, vielen dank für deine Antwort.
Ich hab folgendes Problem: Ich hab einen Thread, der einen Status eines Drivers abfrägt. Tritt Status A ein, wird ein Timer gestartet (z.B. 2 Minuten), nach 2 Minuten fährt der PC runter. Nun kann es aber passieren, dass der Status A zu B wechselt (Normalbetrieb). D.h. der Timer-Thread, der gerade im Sleep(2 Minuten) "schläft", gehört angehalten. Wäre nicht so schwer, ich könnte nach dem Sleep den Status abfragen. Nun könnt es aber noch passieren, dass während des Sleeps der Status von A nach B wechselt und kurz vor Ende des Sleeps von B wieder nach A. Der Timer Thread bekommt die Statusänderung nicht mit und fährt den PC nach nur ein paar Sekunden Wartezeit nieder.
Mir würde als Lösung nur einfall, den Timer Thread mit TerminateThread oder ähnlichem brutal abzuschießen.
-
Dann arbeite doch mit einem Event... den kannst Du dann setzen, wenn sich ein Status geändert hat... alternativ wartet er 2 Minuten und fährt dann den Rechner runter, wenn Du ih nicht vorher signalisierst...
Siehe: CreateEvent / SetEvent
WaitForSingleObject (anstelle von Sleep)
-
Hallo Jochen,
vielen Dank für die Idee. So funktoniert es problemlos!