Timer in einer Klasse



  • Hi!

    Ich möchte die Windows-Timer gerne in eine C++ Klasse stecken, doch irgendwie verliere ich Daten und weiß nicht wieso 😞

    Hier mal der Code:

    #include <windows.h>
    #include <stdio.h>
    
    // callback die von jedem timer der klasse "timer" aufgerufen wird.
    void CALLBACK TTimerProc(HWND hwnd, UINT message, UINT ptr, DWORD dwTimer);
    
    class foo
    {
    private:
        // adresse auf sich selbst.
        UINT address_to_this_;
        // daten des timers die ausgegeben werden sollen in jedem interval
        char data_[80];
    
        // meine eigene timer-proc.
        void CALLBACK my_proc (HWND hwnd, UINT message, UINT ptr, DWORD dwTimer);
    
    public:
        foo (char* data, int interval);
        ~foo (void);
    
        // freundschaft zur globalen funktion.
        friend void CALLBACK TTimerProc (HWND hwnd, UINT message, UINT ptr, DWORD dwTimer);
    };
    
    foo::foo (char* data, int interval)
    {   
        strcpy (data_, data);
    
        address_to_this_ = reinterpret_cast<UINT>(this);
        SetTimer (NULL, address_to_this_, interval, (TIMERPROC)TTimerProc);
    }
    
    foo::~foo (void)
    {
        KillTimer (NULL, address_to_this_);
    }
    
    void foo::my_proc (HWND hwnd, UINT message, UINT ptr, DWORD dwTimer)
    {
        printf ("%s\n", data_);
    }
    
    void CALLBACK TTimerProc (HWND hwnd, UINT message, UINT ptr, DWORD dwTimer)
    {
        reinterpret_cast<foo*>(ptr)->my_proc (hwnd, message, ptr, dwTimer);
    }
    
    void ProcessTimerMessages()
    {
        MSG msg;			
        BOOL ret;
        while (ret=GetMessage(&msg, NULL, NULL, NULL))
        {
            if (ret != -1)
            {
                TranslateMessage(&msg); 
                DispatchMessage(&msg);
            }
        }
    }
    
    int main(int argc, char* argv[])
    {
        foo x("hallo", 250);
        foo y("welt", 500);
    
        ProcessTimerMessages();
    
        return 0;
    }
    

    die "my_proc" wird problemlos aufgerufen, doch "data_" und "this" ist ein badptr 😞

    Jemand eine Idee was ich falsch mache?

    Viele Grüße,
    Euer C++'ler



  • Gehts dir nur darum, dass TimerProc eine Methode ist?



  • Nein.



  • die Beschreibung in der MSDN erscheint mir auch ein bisschen widersprüchlich. Die SetTimer Funktion gibt einen identifier für den Timer zurück und diesen Wert bekommst du auch in deiner TimerProc geliefert. Dieser Wert ist jedoch nicht identisch mit dem, den du als dritten Parameter an die Funktion SetTimer übergibst. check ich grad auch ned ganz 😕



  • äh als zweiten parameter meinte ich, ned als dritten.



  • oh hab was wichtiges überlesen^^

    MSDN schrieb:

    If the call is not intended to replace an existing timer, nIDEvent should be 0 if the hWnd is NULL.

    🤡



  • und wie mache ich das jetzt? hat da jemand eine idee? 😞



  • ach man lass dir halt was einfallen. wenns ned super viele timer sind kannste ja zb ne liste von objekt adressen und timer_id paaren anlegen und in der TTimerProc diese dann durchgehen um von einer timer_id auf ne objekt adresse zu kommen. da gibts doch wahrlich viele möglichkeiten



  • für jeden Timer ein unsichbares Fenster erstellen und dieses dann bei SetTimer angeben. mit SetWindowLongPtr den this pointer setzen und mit GetWindowLongPtr abfragen



  • @ fix0r
    du bist die misserabelste hilfe die man sich nur vorstellen kann

    @tztrh
    danke, das klingt nach nem plan, ich probiers sofort aus.



  • ohne meine hilfe würde es dich gar nicht geben also maul



  • Ich möchte das die Mods die obrige Beleidigung von fix0r bitte entfernen.



  • l0l


Anmelden zum Antworten