Service und Timer



  • Hallo,

    ich schreib zur Zeit einen Service, der züglich seine konfigurierten Jobs überprüfen soll. Jedoch finde ich keinen Ansatz, wie ich einen Timer dort rein bekommen soll. SetTimer funktioniert ja nicht wirklich, da ich ja kein Fenster habe oder muss ich mir jetzt extra ein Fenster erstellen, nur für diesen Timer?
    Ich wäre für einen Ansatz sehr dankbar.

    Danke
    Damion



  • Bei SetTimer kannst du doch eine Callback-Funktion angeben, ohne Fenster.



  • Danke,

    das war das typische Brett vor dem Kopf.

    Damion



  • Hallo,

    ich habe das selbe Problem und hab dazu noch eine Frage. Wenn ich einen Timer ohne Window erstelle, dann muss ich denoch einen MessageDispatcher machen, oder? Muss ich denn jetzt wirklich einen neuen Thread erstellen, um dort den Timer laufen zu lassen da der Service ja seinen eigenen Dispatcher. Ich bekomm das ohne neuen Thread nicht zum laufen. Einer ne Idee???



  • Nein, brauchst du nicht. Du gibst eine Callback-Funktion an. Die wird ohne Umwege aufgerufen.



  • Ich bekomm das irgendwie nicht zum laufen, kann mir einer helfen, ich habe mir dazu mal eine kleine Testapplikation geschrieben, wo mach ich da was falsch??

    #include <windows.h>
    
    void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime );
    
    HANDLE hDoForever;
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
    {
    	HWND hwndTimer;   // handle to window for timer messages 
    	MSG msg;          // message structure 
    	SetTimer(0, 1024, 1, TimerProc);
    
    	hDoForever = OpenEvent(SYNCHRONIZE, FALSE, "sfdafRunEvt");
    	hDoForever = CreateEvent( NULL, FALSE, FALSE, "sfdafRunEvt");
    
    	WaitForSingleObject(hDoForever, INFINITE);
    	return 0;
    }
    void CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime )
    {
    	int i = 0;
    	i = i;
    }
    

    Danke



  • was geht denn nicht ?

    im moment startest du einen timer mit einem intervall von einer millisekunde und in der timerproc initialisiert i mit 0 und setzt i gleich i, ergebniss = 0

    ubrigens: zweiten parameter bei settimer kannst du dir schenken
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Windowing/Timers/TimerReference/TimerFunctions/SetTimer.asp



  • Also das i=I ist einfach dafür gedacht gewesen, dort einen Break-Point zu setzen. Es wird jedoch an diesem Punkt nie gestoppt. Ich hab auch schonmal probier dort eine MessageBox einzubauen, für den Fall das ich dort nicht debuggen könnte(was ich mir jedoch nicht vorstellen kann). Auch die MessageBox wurde nie aufgerufen. Mit dem zweitem Parameter hatte ich auch gelesen, habe aber so nach und nach alles asuprobiert worauf mein krankes Hirn gekommen ist 🙂
    Hat einer eine Idee was ich falsch mache. Ist wahrscheinlich wieder so was dummes, dass ich mir nachher wieder selber den A**** abbeiße.

    Danke



  • Du brauchst einen Message Loop wie du schon richtig rausgefunden hast. DispatchMessage sorgt nämlich für den Aufruf der Timer-Funktion.



  • gibt settimer einen wert zurück? was sagt getlasterror() ?



  • Hier der Ausschnitt aus der MSDN:

    When you specify a TimerProc callback function, the default window procedure calls the callback function when it processes WM_TIMER. Therefore, you need to dispatch messages in the calling thread, even when you use TimerProc instead of processing WM_TIMER.


Anmelden zum Antworten