timeSetEvent



  • Hallo,

    ich weiß einfach nicht mehr weiter, vielleicht könnt ihr mir helfen. ich hab ein Timer-Problem und weiß nicht, wie ich es lösen soll.. Mein kleines Programm zunächst lautet

    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <mmsystem.h>
    
    int a;
    UINT uiTimerID;
    void CALLBACK TimerProc(HWND hwnd, UINT message, UINT iTimerID, DWORD
    dwTime)
    {
    
    	a = 0;
        timeKillEvent(uiTimerID);
    }
    
    int main(void)
    {
      uiTimerID = timeSetEvent(10000, 10, TimerProc, NULL, TIME_ONESHOT);
      while(!a) { };
    }
    

    Das Problem ist. die Funktion funktionert soweit und wartet auch ab, bis a=0 gesetzt wurde, doch anstatt das Fensterchen in der konsole zu schliessen, kommt ein Programmabbruch durch den Just-In-Time.Debugger mit der Fehlermeldung:
    Unbehandelte Win32-Ausnahme in test.exe [1460]
    Weiß jemand Rat? Ich benutze Visio C++. Vielen Dank im voraus!!

    gruss

    payon



  • Deine Callback-Funktion hat ne falsche Signatur

    void CALLBACK TimeProc(UINT timerID, UINT message, DWORD dwUser, DWORD dw1, DWORD dw2)
    {
    ...
    }
    

    👍



  • Vielen dank für die Antwort.

    Ich hatte auch nochmals nachgeschaut.
    Aber die Signaur ist so vorgegeben:

    void (CALLBACK)(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
    

    Wo hab ich denn da den Fehler gemacht? Könntest du mir da einen Tipp geben?

    Danke und gruss

    payon



  • Schau mal bei Deinem ersten Post die Signatur von TimerProc an, das hast Du z.B. als ersten Parameter HWND...



  • Autsch stimmt,

    wie hat sich das denn dort reingeschlichen. Ich habs jetzt auf die richtige signatur umgestellt

    Somit mein kleines Programmchen jetzt:

    #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <mmsystem.h>
    
    #define  FREQ 1
    int a;
    UINT uiTimerID;
    void CALLBACK TimerProc(UINT iTimerID, UINT message, DWORD dwUser , DWORD
    dw1, DWORD dw2)
    
    {
    
    	a = 0;
        timeKillEvent(uiTimerID);
    }
    
    int main(void)
    {
      uiTimerID = timeSetEvent(10000, 10, TimerProc, NULL, TIME_ONESHOT);
      while(!a) { };
    }
    

    Das Problemm ist nur jetzt, dass die Endlos-schleife garnicht mehr aufhört zu laufen, und das Programm somit nicht enden bzw beenden will. Hmm, kannst du mir da vielleicht auch weiterhelfen? Das wäre supi!

    gruss

    payon



  • #include <windows.h>
    #include <stdio.h>
    #include <conio.h>
    #include <mmsystem.h>
    
    #define  FREQ 1
    int a = 1; // initialisieren
    UINT uiTimerID;
    void CALLBACK TimerProc(UINT iTimerID, UINT message, DWORD dwUser, DWORD dw1, DWORD dw2)
    {
        a = 0;
        timeKillEvent(uiTimerID);
    }
    
    int main()
    {
        uiTimerID = timeSetEvent(10000, 10, TimerProc, NULL, TIME_ONESHOT);
        while(a) { }; // äquivalent zu while(a != 0)
    }
    

    Das ist natürlich busy waiting was Du machst. Heißt Du belastest die CPU mit der Leerschleife



  • Hey vielen, vielen Dank, jetzt klappt alles wunderbar 🙂

    das Programm läuft und wird auch je nach delay ausgeschaltet.
    Doch nun hätte ich da vielleicht noch eine Frage. Ich weiß auch, dass diese while-Schleife sehr belastend ist. Und man hört es ja auch direkt am Lüfter, wenn die Funktion aufgerufen wird 🙂

    Welche Möglichkeiten würden sich da noch bieten, ausser eine while-Schleife zu verwenden? ich hatte solche Funktionen ebenfalls schon mal mit getch() gesehen. Wäre das eine Möglichkeit, die nicht so belastend für meine CPU wäre?



  • Du könntest in der Schleife ein Sleep einbauen, somit legt sich Dein Programm für ne gewisse Zeit schlafen. Der TimerEvent ist eh in einem eigenen Thread.

    int main()
    {
        uiTimerID = timeSetEvent(10000, 10, TimerProc, NULL, TIME_ONESHOT);
        while(a)
        {
            Sleep(1000); // für eine Sekunde schlafen legen
        }
    }
    


  • Oh das ist ne super Idee.

    Jetzt läuft die Schleife durch und der Prozessor wird nicht so stark beantsprucht, da er die Schleife ja nur einmal in der secabruft!

    vielen vielen Dank. du hast mir sehr weitergeholfen!
    Es funktionert alles und sogar besser, als ich es gehofft habe, da ich überhaupt nicht daran gedacht habe die sleep funtion einzubauen, sowmit vielen Dank für die tollen Tipps und Tricks .

    Schönes Wochenende wünsche ich noch!

    gruss

    payon


Anmelden zum Antworten