Methoden nach bestimmter Zeit starten



  • Hallo!

    Ich suche eine Möglichkeit Methoden nach einer bestimmten Zeiteinheit zu starten.
    Quasi so:

    nach 0 Sekunden: Starte Methode1
    nach 3 Sekunden: Starte Methode2
    nach 6 Sekunden: Starte Methode3

    Das ganze soll unabhängig davon funktionieren, ob die vorherige Methode schon fertig ist oder nicht und ohne Threads funktionieren (hab zumindest mal gehört, dass es sowas gibt).

    Kann mir jemand helfen?
    GRuß
    -j



  • Ohne Threads wirst du die Bedingung "unabhängig davon ..., ob die vorherige Methode schon fertig is" nicht realisieren können. Schließlich kann der Prozessor nur eine Funktion zur selben Zeit ausführen - und solange alles in einem Thread passiert, bekommt die Zeitüberwachung erst wieder das Kommando, wenn die vorige Funktion fertig ist.



  • Selbst wenn es ohne Threads möglich sein sollte (bin nicht davon überzeugt) würde ich Timer + Threads als optimale Lösung ansehen. Sehe noch kein Argument in deinem Posting warum Timer + Threads nicht zum Einsatz kommen sollen.

    MfG SideWinder



  • Dann ändern wir es so:

    nach 0 Sekunden: Starte Methode1
    nach 3 Sekunden: Starte Methode2, sofern Methode1 fertig, sonst Fehlermeldung
    nach 6 Sekunden: Starte Methode3, sofern Methode1+2 fertig, sonst Fehlermeldung
    ...

    Geht das? Falls ja, wie?

    Grüße!



  • Nicht ohne Timer, die dann wiederum Threading verwenden.

    MfG SideWinder



  • kann man keine funktionzeiger anlegen jeder einzelen funktione, die dann in ein array reinhauen, und diese dann in aeinem trhead nacheinader ausführen?



  • BorisDieKlinge schrieb:

    kann man keine funktionzeiger anlegen jeder einzelen funktione, die dann in ein array reinhauen, und diese dann in aeinem trhead nacheinader ausführen?

    Ja klar, nur ist offenbar Anforderung ohne Threads zurechtzukommen.

    MfG SideWinder



  • unmöglich;)



  • 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


Log in to reply