Probelme mit Timer



  • Hallo Hier meine klassen definietion :

    class FileManager
    {
    
    public:
    
    	FileManager();
    	~FileManager();
    
    	void SearchFile(std::string text);
    
    private:
    
    	// Database Operations
    	bool OpenDatabase();
    	bool CloseDatabase();
    	bool WriteStringToDatbase(std::string sql);
    	bool CreateBackUpTable();
    	bool UpdateDatabase();
    
    	sError CreateErrorStruct(int code, std::string text);
    
    	// Convert Operations
    	std::string ConvertDwordToString( DWORD number);
    	std::string ConvertBoolToString( bool value);
    	std::string RemoveCharacterFromString(std::string character,std::string StringToRemove);
    
    	// Log File Operations
    	void CreateLogFile();
    
    	// File Operations
    	void ReadIniFile();
    	void ScanFolder(std::string folder);
    	void WriteFileInformation(std::string file);
    
    	// Test Funktionn für den Timer
    	void CALLBACK TimerFunction(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2);
    
    	std::vector<sError> vErros;
    	std::vector<std::string> vFolders;
    	CDatabase db;
    	std::string sODBC;
    	int iCurentFilesCount;
    
    };
    

    ich möchte die funktion UpdateDatabase in eimem timer aufrufen. dazu habe ich mir eine TimerFunktion geschrieben.

    // ***********************************************************
    
    void CALLBACK FileManager::TimerFunction(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2) 
    {
    	std::cout << "Timer Function \n";
    //	UpdateDatabase();
    }
    

    Im Konstruktor wird nun ein Timer aufgezogen :

    timeSetEvent(60000,0,TimerFunction,NULL,TIME_PERIODIC);
    

    Leider erlaubt er mir aber nicht die Update Funktion zu öffnen in der Funktion weil sie nicht static ist. Nun wollte ich diese Funktion als static markieren , das zieht abenr einen Rattenschwanz hineter sich her, da die Updat Funktion auch noch weitere Funktionen aufruft, die natürlich auch nicht static sind. Weiß jemand Rat für das Problem ?

    Vielen Dnak



  • Wenn Du aus FileManager ein Singleton machen kannst:

    void CALLBACK TimerFunction(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
    {
        FileManager::getInstance().UpdateDatabase();
    }
    

    ansonsten sowas in der Art wie:

    class Redirector
    {
      FileManager * m_fm;
    public:
      Redirector() : m_fm(0);
      void set(FileManager * fm) {m_fm = fm;}
      void func() {if (m_fm) m_fm->UpdateDatabase()};
    };
    
    static Redirector s_redirector;
    
    void CALLBACK TimerFunction(UINT wTimerID, UINT msg, DWORD dwUser, DWORD dw1, DWORD dw2)
    {
        s_redirector.func();
    }
    

    Nach Instantiierung Deines Filemanager Objektes musst Du dieses natürlich mittels der set() Funktion dem Redirector bekannt machen.

    Es gibt aber durchaus noch ein paar Lösungmöglichkeiten (z.B. boost::function).



  • Ich hätte es jetzt so in der Art probiert, wie bei Threads:
    Member auf static, dem Timer den this-Zeiger als Parameter und dann in der Memberfunktion über den übergebenen Zeiger die Funktionen der Klasse aufrufen.

    Weiß aber nicht ob das so zwingend funktioniert. Im übrigen ist das nicht wirklich Standard C++...


Anmelden zum Antworten