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 nicht2 . 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 }
-
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 damitZermos
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); }