Klasse mit SetTimer



  • Hallo

    Ich wollte in einer Klasse verschiedene Settimer benutzen ,habe erstmal mit der Grundstruktur angefangen

    und habe jetzt mehrere Probleme ,von dehnen ich nicht weis wo´s dran liegen könnte
    (der Timer funktioniert perfekt)

    1. irgendwie kann ich den Timer nachdem er gestartet wurde , nicht mehr abbrechen - KillTimer ist wirkungslos
    Habe verschiedenes Ausprobiert
    laut MSDN gibt der Settimer nur dann den Return Wert aus (für KillTimer), wenn
    Hwnd = NULL ist (wenn ich das mache startet der Timer erst gar nicht), sonst verlangt er nIDEvent (siehe Unten ) - und das klappt irgendwie nicht

    2 . da ich verschiedene Timer benutzen will muss ich das über nIDEvent machen
    dazu habe ich gefunden , das diese Struct als Pointer an nIDEvent übergeben werden soll
    habe das gemacht , aber während das Programm startete stürzte mir das teil ab
    (habs vorerst wieder rausgeschmissen , daher unten ohne das)

    struct
    {
    FileTransfer* This;
    UINT_PTR id;
    };
    

    Ich hoffe jemand kann mir Helfen , ich sitze seit 4 Tagen an dem Problem und im Internet hab ich nicht viel dazu gefunden (oder falsch gesucht)

    Danke schon mal für die Hilfe

    Zermos

    FileTransfer.h

    #pragma once
    class FileTransfer
    {
    public:
    	char *x;
    	FileTransfer(void);
    	FileTransfer(HWND,DWORD dwMilliseconds);
    	~FileTransfer(void);
    	void StartConnectionTimer(HWND,DWORD dwMilliseconds);
    	static VOID CALLBACK StaticConnectionTimeout(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
    	VOID CALLBACK ConnectionTimeout(HWND hWnd, UINT uMsg, DWORD dwTime);
    };
    

    FileTransfer.cpp

    #include <Windows.h>
    #include "FileTransfer.h"
    #define Reiter 81 
    
    FileTransfer::FileTransfer(void)
    {		
    
    }
    FileTransfer::FileTransfer(HWND hwnd,DWORD dwMilliseconds)
    {		
    		x = "hallo";
    	StartConnectionTimer(hwnd,dwMilliseconds);
    
    }
    
    FileTransfer::~FileTransfer(void)
    {
    }
    
    void FileTransfer::StartConnectionTimer(HWND hwnd,DWORD dwMilliseconds) {
    
      SetTimer(hwnd,UINT_PTR(this), dwMilliseconds, &FileTransfer::StaticConnectionTimeout);
    }
    VOID CALLBACK FileTransfer::StaticConnectionTimeout(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
    {
    ((FileTransfer*)idEvent)->ConnectionTimeout(hWnd,uMsg,dwTime);
    
    }
    VOID CALLBACK FileTransfer::ConnectionTimeout(HWND hWnd, UINT uMsg, DWORD dwTime) {
    	MessageBox(0,x,0,0);
    	KillTimer(hWnd,UINT_PTR(this));
      //bleh
    }
    

  • Mod

    Ist hWnd auch wirklich nciht NULL, in diesem Fall musst Du den Wert der bei durch SetTimer zurückgegeben wird für KillTimer verwenden.



  • Ja der Gibt ein Wert aus ,Das Problem liegt warscheinlich in dem Aufruf der Funktion "ConnectionTimeout"
    Ich habe das ganze Teil mal komplett überarbeitet , es ist jetzt möglich ,mehr als 1 Settimer zu starten (bekommt den wert von Settimer überreicht)

    in der Selben Funktion wo er gestartet wird , kann er auch gestoppt werden
    bzw von Aussenhalb der Klasse (oder mithilfe einer Klassen Funktion)

    - nur innerhalb von "ConnectionTimeout" kann er keinen Timer aufrufen bzw stoppen (bzw in allen Funktionen die von "ConnectionTimeout" gestartet wurden)

    hab einiges versucht das hinzubekommen , aber da ich nicht weiß woran das liegt kann ich nicht viel machen

    Zur Not kann ich damit Leben , aber ist schon nervig

    falls jemand weiß woran das liegt ...

    oder eine andere Möglichkeit kennt , Timer in Klassen zu starten und zu beenden
    immer her damit

    Zermos

    FileTranfer.h

    #pragma once
    
    class FileTransfer
    {
    public:
    	char *x;
    	FileTransfer(void);
    	FileTransfer(DWORD dwMilliseconds,UINT_PTR = NULL);
    	~FileTransfer(void);
    	UINT_PTR StartConnectionTimer(DWORD dwMilliseconds);
    	static VOID CALLBACK StaticConnectionTimeout(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
    	VOID CALLBACK ConnectionTimeout(HWND hWnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime);
    	UINT_PTR Timer1;
    	UINT_PTR Timer2;
    	UINT_PTR Timer3;
    	void weiter();
    private:
    	UINT_PTR pTimer;
    	static void * pObject;
    };
    

    FileTransfer.cpp

    #include <Windows.h>
    #include "FileTransfer.h"
    
    FileTransfer::FileTransfer(void)
    {		
    
    }
    FileTransfer::FileTransfer(DWORD dwMilliseconds,UINT_PTR idEvent)
    {		
    		x = "hallo";
    Timer1 = StartConnectionTimer(dwMilliseconds);
    Timer2 = StartConnectionTimer(300);
    // KillTimer(NULL,Timer2); /* Hier kann Timer beendet werden*/
    }
    
    FileTransfer::~FileTransfer(void)
    {
    }
    
    void * FileTransfer::pObject;
    
    UINT_PTR FileTransfer::StartConnectionTimer(DWORD dwMilliseconds) {
    	UINT_PTR pTimer;
       pObject = this; // VERY IMPORTANT, must be initialized before
       pTimer = SetTimer(NULL,NULL, dwMilliseconds, &FileTransfer::StaticConnectionTimeout);
    	return pTimer;
    }
    VOID CALLBACK FileTransfer::StaticConnectionTimeout(HWND hwnd, UINT uMsg, UINT_PTR idEvent, DWORD dwTime)
    {
     FileTransfer *pSomeClass = (FileTransfer*)pObject; // cast the void pointer
     pSomeClass->ConnectionTimeout(hwnd, uMsg,idEvent, dwTime); // call non-static function
    }
    VOID CALLBACK FileTransfer::ConnectionTimeout(HWND hWnd, UINT uMsg, UINT_PTR idEvent,DWORD dwTime) {
    
    	if (idEvent == Timer1)
    	{
               MessageBox(0,L"huhu",0,0); // das wird normal abgearbeitet	
                    KillTimer(NULL,Timer1); // Hier klappt es nicht
    		//blah
    	}
    	if (idEvent == Timer2)
    		Beep(2345,100);
    
    	if (idEvent == Timer3)
    		MessageBox(0,0,0,0);
    }
    

Log in to reply