Timer - Ich bekomm das einfach nicht in Kopf



  • Hi,

    ich versuche jetzt schon bald seit zwei Tagen einen einfachen Timer zu nutzen...

    Hab mir schon weiß nicht wie oft das hier durchgelesen
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_multimedia_timer_reference.asp
    aber ich verstehe einfach nicht wie ich da anfangen soll... 😞

    Was ich bis jetzt verstanden/nicht verstanden habe:
    -das was der Timer ausführen soll kommt in die OnTimer() Methode
    -Hiermit wird der Timer irgendwie gestartet...

    npSeq->wTimerID = timeSetEvent(msInterval, GetTimerRes(), OnTimer, (DWORD)npSeq, TIME_PERIODIC);
    

    -npSeq - was ist das?
    -wTimerID - ist das der eingentliche Timer? wenn ja, was für ein Typ ist das - und muss der nicht irgendwie deklariert werden, z.B.

    Timer wTimerID;
    

    -timeSetEvent - Methode zum Starten des Timers
    -msInterval - interval nach dem aufgerufen wird
    -GetTimerRes() - für die genauigkeit des Intervalls
    -Ontimer - Methode die das enthält was getan werden soll
    -(DWORD)npSeq - was ist das??
    -TIME_PERIODIC - besagt das nicht nur einmal sondern immer wieder ausgeführt wird

    Kann mir bitte jemand das versuchen näher zubringen...
    Top wäre ein kleines einfaches Beispiel von Deklaration, Aufruf usw.

    Vielen Dank schonmal
    Gruß
    Fabian



  • So hab jetzt nochmal gesucht,versucht und gebastelt...

    #include <cstdlib>
    #include <iostream>
    #include "windows.h"
    
    using namespace std;
    
    void CALLBACK OnTimer(UINT nTimerID);
    
    int main(int argc, char *argv[])
    {  
    timeSetEvent((UINT)50000, (UINT)10, OnTimer, (DWORD)0, TIME_PERIODIC);   
    }     
    
    void CALLBACK OnTimer(UINT nTimerID)
    {
        cout<<"test";
    }
    

    als fehler kommt

    C:\Dev-Cpp\timertest\main.cpp In function int main(int, char**)': 16 C:\\Dev-Cpp\\timertest\\main.cpp invalid conversion from \void ()(UINT)' to `void ()(UINT, UINT, DWORD, DWORD, DWORD)'
    16 C:\Dev-Cpp\timertest\main.cpp initializing argument 3 of `MMRESULT timeSetEvent(UINT, UINT, void (*)(UINT, UINT, DWORD, DWORD, DWORD), DWORD, UINT)'
    C:\Dev-Cpp\timertest\Makefile.win [Build Error] [main.obj] Error 1

    Also scheint irgend was mit Argument 3 nicht i.o.!?

    oder ist das komplett falsch?



  • Hi,

    #include <Windows.h>

    Du hast die Header und die Library für die Funktion timeSetEvent 😉 vergessen.

    MSDN zu timeSetEvent schrieb:

    Windows XP: Included in Windows XP only.
    Header: Declared in Mmsystem.h; include Windows.h.
    Library: Use Winmm.lib.

    Siehe: timeSetEvent (MSDN)

    Die Syntax deiner TimerProc (OnTimer) entspricht nicht der vorgeschriebenen Syntax (Anzahl der Parameter).

    Siehe: TimerProc (MSDN)

    EDIT: Vertipper :p ...



  • fub0815 schrieb:

    Also scheint irgend was mit Argument 3 nicht i.o.!?

    Ja. Genauer gesagt passt die Signatur deiner Callbackfunktion nicht. Auf der Seite, auf die du verlink hast, steht, welche Signatur die Callbackfunktion haben muss:

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



  • Danke erstmal für die Antworten.
    Zur lib, ich benutze wxDevcpp und habe libwinmm.a eingebunden. Ist hoffe ich die Richtige.
    hab es wie folgt geändert:

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    void CALLBACK OnTimer(UINT nTimerID);
    UINT myTimerID;
    
    int main(int argc, char *argv[])
    {  
    myTimerID=timeSetEvent((UINT)50000, (UINT)10, OnTimer, (DWORD)0, TIME_PERIODIC);   
    }     
    
    void CALLBACK OnTimer(UINT myTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
    {
        cout<<"test";
    }
    

    der Fehler bleibt aber leider der gleiche.



  • Du hast, wie ich oben aber schon geschrieben habe, den Header vergessen...



  • Wie den Header vergessen, versteh ich nicht 😕

    bei den Prototypen oben habe ich vergessen zu ändern.

    #include <cstdlib>
    #include <iostream>
    #include <windows.h>
    
    using namespace std;
    
    void CALLBACK OnTimer(UINT myTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2);
    UINT myTimerID;
    
    int main(int argc, char *argv[])
    {  
    myTimerID=timeSetEvent((UINT)50000, (UINT)10, OnTimer, (DWORD)0, TIME_PERIODIC);   
    }     
    
    void CALLBACK OnTimer(UINT myTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2)
    {
        cout<<"test";
    }
    

    compilert jetzt fehlerfrei. aber wenn ich es ausführe passiert nix. 😞



  • fub0815 schrieb:

    aber wenn ich es ausführe passiert nix. 😞

    Das ist auch richtig so. Wenn deine main-Funktion beendet ist, ist auch dein Programm beendet. Timer hin oder her.



  • Yepp, so isses. Da hilft ein

    int i;
    cin >> i;



  • Danke @all
    es geht jetzt mit dem
    int i;
    cin >> i;

    Eine frage noch, hatte vorher eine endlos schleife drum gesetzt, und wenn der Timer ausgelöst wurde kamm dann nicht nur einmal test, sondern 15-20mal auf einen schlag...Warum?


Anmelden zum Antworten