Timer/Interval Klasse richtig in CPP/H-Dateien aufteilen bzw. codieren ?



  • Hallo,

    wahrscheinlich ist es nicht unbedingt gut, komplizierte Sachverhalte aus dem Internet zu übernehmen, obwohl man (als Anfänger) nicht alles versteht. Trotzdem möchte ich einen Timer bzw. Interval Code nutzen, bei dem mir allerdings offensichtlich nicht alles gelungen ist, um den Code für die C++ Header- und die CPP-Datei richtig aufzuteilen. Ich habe hier den unteren Quelltext genommen und insofern angepasst, nach bestem Wissen und Probieren 😉 . Könntet ihr bitte mal schauen, was daran noch nicht richtig ist - es werden mir noch 6 Fehler bei Visual Studio angezeigt.

    Timer.h

    #include <chrono>
    #include <condition_variable>
    #include <functional>
    #include <mutex>
    #include <thread>
    
    template <class F>
    class Timer
    {
    public:
    	explicit Timer(F f, std::chrono::system_clock::duration d)
    		: f_{std::move(f)}
    		, d_{d}
    		, run_now_{std::chrono::system_clock::now()}
    		, quit_{ false }
    		, thr_{ &Timer::run, this };
    	~Timer();
    private:
    	std::mutex mut_;
    	std::condition_variable cv_;
    	std::function<void()> f_;
    	std::chrono::system_clock::duration d_;
    	std::chrono::system_clock::time_point run_now_;
    	bool quit_;
    	std::thread thr_;
    private:
    	void run();
    };
    

    Timer.cpp

    #include "Timer.h"
    
    template <class F>
    Timer<F>::Timer(F f, std::chrono::system_clock::duration d)
    	: f_{ std::move(f) }
    	, d_{ d }
    	, run_now_{ std::chrono::system_clock::now() }
    	, quit_{ false }
    	, thr_{ &Timer::run, this }
    {
    }
    
    Timer::~Timer()
    {
    	{
    		std::lock_guard lock{ mut_ };
    		quit_ = true;
    	}
    	cv_.notify_one();
    	thr_.join();
    }
    
    void Timer::run()
    {
    	while (true)
    	{
    		f_();
    		run_now_ += d_;
    		std::unique_lock lock{ mut_ };
    		if (cv_.wait_until(lock, run_now_, [this]() {return quit_; }))
    			break;
    	}
    }
    


  • Es würde schon helfen, wenn du die Compilerfehler inkl. Zeilennummern auch noch posten könntest.



  • Bitte schön:

    Schweregrad Code Beschreibung Projekt Datei Zeile Unterdrückungszustand
    Fehler (aktiv) E0441 Die Argumentliste für "Klassenvorlage "Timer"" fehlt. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 13
    Fehler (aktiv) E0441 Die Argumentliste für "Klassenvorlage "Timer"" fehlt. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 23
    Fehler (aktiv) E0020 Der Bezeichner ""thr_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 20
    Fehler (aktiv) E0020 Der Bezeichner ""run_now_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 28
    Fehler (aktiv) E0020 Der Bezeichner ""quit_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 17
    Fehler (aktiv) E0020 Der Bezeichner ""quit_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 30
    Fehler (aktiv) E0020 Der Bezeichner ""mut_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 16
    Fehler (aktiv) E0020 Der Bezeichner ""mut_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 29
    Fehler (aktiv) E0020 Der Bezeichner ""f_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 27
    Fehler (aktiv) E0020 Der Bezeichner ""d_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 28
    Fehler (aktiv) E0020 Der Bezeichner ""cv_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 19
    Fehler (aktiv) E0020 Der Bezeichner ""cv_"" ist nicht definiert. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 30
    Fehler (aktiv) E0258 "this" darf nur innerhalb einer nicht statischen Memberfunktion verwendet werden. Widget15 C:\Users\stefa\source\repos_EigeneVersuche\Widget15_Test\Widget13\Timer.cpp 30



  • @stefanpc81 implementiere deine Templates im Header.

    Da ich gerade faul bin: genauere Erklärungen findest du hier: https://isocpp.org/wiki/faq/templates#templates-defn-vs-decl



  • Die Antwort von @Schlangenmensch beinhaltet, wie es dann am Ende aussehen muss.
    So wirst du es dann machen müssen, aber die derzeitigen Fehler beziehen sich darauf, dass es eine Klasse "Timer" nicht gibt, du also jeder Funktion ein "template <class F> Timer<F>::" spendieren musst.
    Nur zur Vollständigkeit oder wenn du die Defintion und Deklaration (im header) getrennt halten willst, brauchst du das auch.



  • @Jockelx sagte in Timer/Interval Klasse richtig in CPP/H-Dateien aufteilen bzw. codieren ?:

    ...also jeder Funktion ein "template <class F> Timer<F>::" spendieren musst. ...

    Das war es, VS zeigt jetzt 0 Fehler an. Vielen Dank!


Log in to reply