Timer als Thread erstellen



  • Hallo,

    ich möchte die SetTimer(...) Funktion in einer Wrapper Klasse verpacken in der ich über das Publisher-Subscriber-Pattern Listener registrieren kann, die über das TimeEvent informiert werden sollen.

    Ich möchte das die o. g. Wrapper-Klasse als Thread erstellt wird. Wie kann ich das denn realisieren ?

    Ich habe im folgenden meine "Timer.h" und "TimeEventListener.h" anghängt. Meine bisjetzige "TImer.cpp" bzw. einzelne Implementierungen kann ich auf Anfrage ebenfalls posten.

    TimeEventListener.h

    #pragma once
    
    class TimeEventListener
    {
    public:
    	void PerformTimeOutEvent(void);
    };
    

    Timer.h

    #include <windows.h>
    #include <list>
    #include <map>
    
    #include <iostream>
    
    #include "TimeEventListener.h"
    
    using namespace std;
    
    class Timer
    {
    private:
    
    	unsigned int milliseconds;
    
    	unsigned int id;
    
    	list<TimeEventListener*> timeEventListeners;
    
    	static map<unsigned int, list<TimeEventListener*>*> timeEventListenersMap;
    
    public:
    
    	Timer(unsigned int milliseconds);
    
    	~Timer(void);
    
    	void SetInterval(unsigned int milliseconds);
    
    	unsigned int GetIntervall(void);
    
    	void Start (void);
    
    	void Stop (void);
    
    	void InsertTimeEventListener(TimeEventListener* listener);
    
    	void RemoveTimeEventListener(TimeEventListener* listener);
    
    private:
    
    	//Thread Methode
    	static void StartThread (void* parameters)
    	{
    	}
    
    	//Timer Methode
    	static void CALLBACK PerformTimeEvent(HWND hWnd, UINT_PTR nIDEvent, UINT uElapse, TIMERPROC lpTimerFunc)
    	{
    	}
    
    };
    

    Gruß und Danke



  • Ich hab keine Ahnung von dem C++ Quark, den du da brabbelst, aber was ist jetzt dein konkretes Problem? Zeig mir den Code und formuliere bitte dein Anliegen.



  • Hallo,

    also ich möchte den Timer mit dem Konstruktor erstellen und mit dem Zeitintervall in Millisekunden initialisieren können.

    Timer(unsigned int milliseconds);
    

    Die Klasse Timer soll aber auch ein Thread sein. Nur weiss ich nicht genau ob ich die Funktion

    uintptr_t _beginthread( 
       void( __cdecl *start_address )( void * ),
       unsigned stack_size,
       void *arglist 
    );
    

    im Konstruktor von Timer aufrufen soll oder in der Methode

    [
    void Start (void);
    /cpp]
    
    Mit den Methoden
    
    [cpp]
    void InsertTimeEventListener(TimeEventListener* listener);
    
    void RemoveTimeEventListener(TimeEventListener* listener);
    

    soll man Referenzen von Klassen registrieren bzw. entfernen können, die von TimeEventListener ableiten. Sind diese Referenzen registriert wird vo jeder die Methode

    void PerformTimeOutEvent(void);
    

    aufgerufen und die Listener werden über das Zeit-Event informiert und können ihre Zeitgesteuerte Funktionalität ausführen.

    Der Thread soll so lange ablaufen, bis die Methode

    void Stop (void);
    

    aufgerufen wird.



  • Hier ist noch meine derzeitige Timer.cpp.

    #include "Timer.h"
    
    #include <process.h>
    
    Timer::Timer(unsigned int milliseconds)
    {
    	this->SetInterval(milliseconds);
    }
    
    Timer::~Timer(void)
    {
    }
    
    void Timer::SetInterval(unsigned int milliseconds)
    {
    	this->milliseconds = milliseconds;
    }
    
    unsigned int Timer::GetIntervall(void)
    {
    	return this->milliseconds;
    }
    
    void Timer::Start(void)
    {
    	unsigned int milliseconds = this->GetIntervall();
    	unsigned int id = 1;
    	SetTimer(NULL, id, milliseconds, &(TIMERPROC)PerformTimeEvent);
    	cout << "1" << endl;
    	Timer::timeEventListenersMap.insert(make_pair(id, &this->timeEventListeners));
    	cout << "2" << endl;
    	HANDLE thread = reinterpret_cast<HANDLE>(_beginthreadex(NULL, 0, StartThread, NULL, CREATE_SUSPENDED, id));
    	cout << "3" << endl;
    }
    
    void Timer::Stop(void)
    {
    	unsigned int id = 1;
    	KillTimer(NULL, id);
    	Timer::timeEventListenersMap.erase(id);
    }
    
    void Timer::InsertTimeEventListener(TimeEventListener* listener)
    {
    	this->timeEventListeners.push_front(listener);
    }
    
    void Timer::RemoveTimeEventListener(TimeEventListener* listener)
    {
    	this->timeEventListeners.remove(listener);
    }
    
    map<unsigned int, list<TimeEventListener*>*> Timer::timeEventListenersMap;
    
    int main (void)
    {
    	Timer timer = Timer(5000);
    	timer.Start();
    	return (0);
    }
    

Anmelden zum Antworten