Methoden nach bestimmter Zeit starten



  • Hatte mal aufgeschnappt, dass es wohl ohne Theads geht, aber nach so vielen Gegenstimmen...

    Hat jemand dann ein gutes Beispiel für Timer+Threads?

    Danke!



  • Unter UNIX könnte man noch einen Alarm installieren (alarm + signal + SIGALRM), der unterbricht nach einer gewissen Zeit was auch immer gerade läuft und steuert einen Signalhandler an. Von dem aus könnte man ein Flag setzen welches die Funktion zur Rückkehr und das Hauptprogramm zur Ausgabe einer Fehlermeldung veranlasst. Keine Ahnung ob es Alarm unter Windows auch gibt.



  • @joergh: Wie ich schon oben sagte: Ohne Threads bekommt das Hauptprogramm erst wieder die Kontrolle, wenn die letzte aufgerufene Funktion sich beendet hat. Bis dahin kannst du weder eine weitere Funktion anstarten noch eine Fehlermeldung ausgeben. Du kannst höchstens am Ende von Methode1 kontrollieren, ob du noch im Zeitplan bist.

    PS: Benutz mal die Suchfunktion (gerade im MFC-Board tauchen regelmäßig Fragen zu Threads auf) oder die MSDN, wenn du Beispiele benötigst.



  • joergh schrieb:

    Hatte mal aufgeschnappt, dass es wohl ohne Theads geht, aber nach so vielen Gegenstimmen...

    Hat jemand dann ein gutes Beispiel für Timer+Threads?

    Danke!

    Timer brauchst du in deinem speziellen Fall gar nicht, dir reicht eigentlich soetwas:

    typedef <...> Func;
    Func func [3];
    func[0] = func1;
    func[1] = func2;
    func[2] = func3;
    
    for(int i = 0; 0 < 3; ++i)
    {
        CreateThread ( func[i] );
        Sleep ( 3000 );
    }
    

    Threads kannst du über verschiedene APIs erstellen. Da wäre zum Beispiel die Möglichkeit für Windows mit Hilfe der WinAPI (CreateThread - siehe MSDN). Für Linux gibts glaube ich beginthread().

    Aber du kannst z.B. auch guten Gewissens die boost::thread-Bibliothek aus Boost verwenden.

    MfG SideWinder



  • auf SPS gehts 😉



  • Das SideWinder-Beispiel hilft mir so leider doch nicht...

    Methode1 soll zum Zeitpunkt 0 gestartet werden.
    Nach 3 Sekunden soll geguckt wernde, ob Methode1 noch läuft. Wenn ja: Warnung, wenn nein: Methode 2 starten.#

    Danke für Eure Hilfe und Eure GEduld...



  • Und was soll passieren wenn die Warnung abgegeben wurde? Warten bis die 1. Funktion beendet wurde oder soll dann die 2. Funktion trotzdem sofort gestartet werden oder soll die 2. Funktion nie gestartet werden?

    MfG SideWinder



  • SideWinders Beispiel läuft ja auch auf deine ursprüngliche Anforderung hinaus - alle drei Sekunden eine Funktion starten und laufen lassen. Wenn du die überprüfen willst, ob die vorige Funktion noch läuft, kannst du das von CreateThread() gelieferte Handle aufheben und auswerten:

    for(int i = 0; 0 < 3; ++i)
    {
        HANDLE h = CreateThread ( func[i] );
        Sleep ( 3000 );
        if(WaitForSingleObject(h,0)==WAIT_TIMEOUT)
        {
            cout<<"Funktion noch aktiv";
            break;
        }
    }
    


  • SideWinder schrieb:

    Und was soll passieren wenn die Warnung abgegeben wurde? Warten bis die 1. Funktion beendet wurde oder soll dann die 2. Funktion trotzdem sofort gestartet werden oder soll die 2. Funktion nie gestartet werden?

    Nach dem gleichen Zeitfenster wird erneut geprüft: Methode1 läuft noch: Warnung, läuft nicht mehr: Methode 2.
    Wenn Warnung: Wieder gleiches Zeitfenster abwarten und .. s.o.



  • Dann baust du CSTolls Beispiel etwas um:

    bool printWarning () { cout << "Warnung" << endl; return true; }
    
    for(int i = 0; i < 3; ++i)
    {
        HANDLE h = CreateThrad(...);
        do
        {
            Sleep(3000);
        }
        while(WaitForSingleObject(h,0) == WAIT_TIMEOUT && printWarning());
    }
    

    Wenn du nicht die WinAPI benützt, kannst du das als Muster benützen. Die tatsächlichen Funktionen ersetzt du dann eben (z.B. durch boost::thread-Aufrufe).

    MfG SideWinder


Anmelden zum Antworten