multimedia timer wie?



  • Hallo, ich brauche einen Timer, der windows + c++ conform ist. also hab ich mich für den multimediatimer entschieden. Das Problem ist die Übergabe der Parameter, ich gebe zu das mich das ein wenig verwirrt. Der Timer ist direkt in eine Klasse integriert. Der Code sieht folgendermaßen aus:
    A.h

    class A
    {
    public:
    static void tester();
    //...
    private:
    void CALLBACK TimeProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
    };
    

    A.cpp

    void A::TimeProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2){
    	cout << "Timer geht!" << endl;
    }
    
    void A::tester(){
    UINT uDelay = 1000;
    		UINT uResolution = 1;
    		DWORD dwUser = NULL;
    		UINT fuEvent = TIME_PERIODIC; //You also choose TIME_ONESHOT;
    		MMRESULT FTimerID;
    		timeBeginPeriod(1);
    		FTimerID = timeSetEvent(uDelay, uResolution, (LPTIMECALLBACK)&A::TimeProc, dwUser, fuEvent);
    		if(FTimerID==NULL){
    			printf("Failed to generate multimedia timer.\n");
    		}
    		Sleep(10000);
    		timeKillEvent(FTimerID);
    		timeEndPeriod(1);
    }
    

    Das Problem ist beim timeSetEvent der dritte Parameter. es wäre schön wenn ich zu Lösung oder Hilfe auch ein paar Hinweise zum Sinn und Zweck bekomme könnte. Vielen dank schonmal im vorraus, auf euch ist ja immer verlass 👍

    Der Fehler in VS 2008: error C2440: 'Typumwandlung': 'void (__stdcall A::* )(UINT,UINT,DWORD,DWORD,DWORD)' kann nicht in 'LPTIMECALLBACK' konvertiert werden
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist



  • Funktionsdeklaration für LPTIMECALLBACK laut MSDN:

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

    Deine Funktionsdeklaration sollte also wie folgt lauten:

    void CALLBACK TimeProc(UINT uTimerID, UINT uMsg, DWORD *dwUser, DWORD *dw1, DWORD *dw2);
    

    bzw. (wenn man die bescheuerten Microsoft Typnamen benutzen will)

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

    In der Funktion selber musst du die Pointer dann natürlich dereferenzieren um den Wert herauszubekommen.



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • könnte ich das auch ausnullen oder so, weil ich will der funktion keine parameter übergeben.? Also ich habe auch ein Member was existiert.

    Müsste ich da nicht einfach nur wie beim erstellen von threads nur schreiben:

    FTimerID = timeSetEvent(uDelay, uResolution, &member_A.TimeProc, dwUser, fuEvent)
    

    Aber leider kommt der compiler da auch durcheinander. Der Fehler in der Konsole:
    A.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeEndPeriod@4" in Funktion ""public: static void __cdecl A::tester(char *)" (?tester@A@@SAXPAD@Z)".
    1>A.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeKillEvent@4" in Funktion ""public: static void __cdecl A::tester(char *)" (?tester@A@@SAXPAD@Z)".
    1>A.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeSetEvent@20" in Funktion ""public: static void __cdecl A::tester(char *)" (?tester@A@@SAXPAD@Z)".
    1>A.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "__imp__timeBeginPeriod@4" in Funktion ""public: static void __cdecl A::tester(char *)" (?tester@A@@SAXPAD@Z)".

    hab es auch ohne dem "&" versucht. selbes ergebnis. Das Proeblem ist denke ich das die eine memberfunktion ist. Der Code sieht jetzt folgendermaßen aus mit den Fehlern:

    A.h

    class A
    	{
    		public:
                            static void tester();
    			//..
    			static void CALLBACK TimeProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2);
    		private:
    			//...
    
    	};
    

    A.cpp

    void A::TimeProc(UINT uTimerID, UINT uMsg, DWORD dwUser, DWORD dw1, DWORD dw2){
    	cout << "Timer geht!" << endl;
    }
    void A::tester(){
    UINT uDelay = 1000;
    		UINT uResolution = 1;
    		DWORD dwUser = NULL;
    		UINT fuEvent = TIME_PERIODIC; //You also choose TIME_ONESHOT;
    		MMRESULT FTimerID;
    		timeBeginPeriod(1);
    		FTimerID = timeSetEvent(uDelay, uResolution, member_A.TimeProc, dwUser, fuEvent);
    		if(FTimerID==NULL){
    			printf("Failed to generate multimedia timer.\n");
    		}
    		Sleep(10000);
    		timeKillEvent(FTimerID);
    		timeEndPeriod(1);
    }
    

    Oben wird noch member_A erzeugt. member_A.tester() wird dann später aufgerufen.



  • WinMM.lib eingebunden?
    "Verweis auf nicht aufgelöstes externes Symbol "__imp__timeEndPeriod@4" in Funktion" ist der Hinweis des Linkers (die Codegenerierung wurde komplett und ohne Fehler abgeschlossen, Syntaxfehler können also nicht die Ursache sein) dass er eine von dir aufgerufene Funktion nicht findet. Das ist üblicherweise immer der Fall wenn du vergessen hast eine .lib einzubinden.

    Ich würde dir empfehlen die MSDN Seiten zu den Funktionen anzuschauen, da stehen sowohl die benötigten Libs, die genauen Definitionen als auch ob und wo du was ausnullen kannst. Ausnullen kommt IMHO nur im Aufruf von timeSetEvent in Frage, und zwar der Parameter dwUser, so wie ich das gerade gelesen habe. In die Funktionsdeklaration kommt natürlich kein NULL.

    Wie man die MSDN Seiten findet? na so:
    Google: MSDN timeSetEvent



  • ja ;(, die lib hat gefehlt, super vielen dank. 👍


Log in to reply