max. Anz. v. WaitableTimern im System...



  • Hi,

    ich habe eine Klasse geschrieben, die die Steuerung von externen Geräten über einen Com-Port umsetzt.
    Wenn keinen Benutzereingaben gemacht werden, dann muss die zugehörige Instanz ein Lebenszeichen senden. Mit einer Instanz funktioniert das Ganze wunderbar, doch sobald eine zweite Instanz erstellt wird, wird die erste "rausgeschmissen" und die andere läuft munter weiter. Für mich sieht das so aus, als würden sich die zuständigen Threads eine Ressource teilen. Das für jeden Thread ein eigener Timer erstellt wird, hab ich so umgesetzt:

    static DWORD WINAPI MyClass::Thr_LifeSign (LPVOID ThrParam)
    {
        ....
        HANDLE hTi_LifeSign = 0xcccccccc;
    
        stringstream ssH;
        unsigned short Count = 0;
        char *pcNameTi = "Perf_LifeSign";
        string sName;
        while (hTi_LifeSign != NULL)
        {
            ssH.clear();
            ssH.str("");
            ssH << pcNameTi << Count;
            sName = ssH.str();
    
            hTi_LifeSign = OpenWaitableTimer (0, false, sName.c_str());
            //öffnen, wenn nicht vorhanden hTi_LifeSign = NULL
        }
    
        hTi_LifeSign = CreateWaitableTimer (NULL, false, sName.c_str());
        ...
    }
    

    Gibt es da sonst elegantere Lösungen, oder könnt ihr vielleicht Fehler entdecken? 😕



  • Wieso sollte hier für jede Instanz einen eigenen Timer verwendet werden !? Du übergibst doch immer den gleichen Name?



  • Ach ich hab das ++Count am Ende der Schleife vergessen. Sorry ich hab das gestern in aller Eile geschrieben. Es muss natürlich so aussehen.

    static DWORD WINAPI MyClass::Thr_LifeSign (LPVOID ThrParam)
    {
        ....
        HANDLE hTi_LifeSign = 0xcccccccc;
    
        stringstream ssH;
        unsigned short Count = 0;
        char *pcNameTi = "Perf_LifeSign";
        string sName;
        while (hTi_LifeSign != NULL)
        {
            ssH.clear();
            ssH.str("");
            ssH << pcNameTi << Count;
            sName = ssH.str();
    
            hTi_LifeSign = OpenWaitableTimer (0, false, sName.c_str());
            //öffnen, wenn nicht vorhanden hTi_LifeSign = NULL
            ++Count;
        }
    
        hTi_LifeSign = CreateWaitableTimer (NULL, false, sName.c_str());
        ...
    }
    

    Das Problem besteht trotzdem, weil ich's gestern nur vergessen hatte. Bei mir im Code steht's natürlich.



  • Auch mit diesem Code stellst Du sicher, dass Du genau einen Waitable-Timer für alle Threads hast!
    Du solltest eine Funktion machen, welche Dir einen eindeutigen Namen zurückliefert und diese auch Multi-Threading-Sicher ist. Oder am besten "CoCreateGuid"



  • Also ich habs jetzt noch gemacht, dass die Instanz einen Namen bekommt, der vorher schon geprüft wird, ob er vorhanden ist oder nicht. Und der Name wird dann auch für den Timer verwendet, was dann auch wunderbar funktioniert.
    Allerdings ist mir jetzt immer noch nicht klar, warum mein geposteter Code nicht funktioniert hat. Nach meinem Verständnis hätte er doch eigentlich

    sName = "Perf_LifeSign0"
    sName = "Perf_LifeSign1"
    sName = "Perf_LifeSign2"
    ...

    liefern müssen. Je nach dem wie viele Timer schon erstellt wurden. 😕

    Gibt es nun eigentlich eine Beschränkung von Timern im System?



  • Eigentlich irrelevant, denn so bald du sie erreichen solltest, hast du ein Designproblem und du solltest dein Programm überarbeiten. 😉


Anmelden zum Antworten