Event nach Zeit



  • Ich möchte ein funktion zb nach 2 minuten ausführen..
    wie mach ich denn das am besten?

    mit ne zeit vom system holen timegettime 2 minuten addieren und dann in einer if schleife überprüfen?

    oder gibs da noch ne möglichkeit ein event bei einer bestimmten zeit auszuführen?

    danke.. 😕



  • http://www.hki.uni-koeln.de/teach/ss06/PS_C++/tag23/21/kap04.htm

    helmut a. schrieb:

    if schleife

    Waaah, sowas gibt es nicht!
    Wo kommt dieses Wortkonstrukt nur immer wieder her? 😮


  • Mod

    Ist es eine Funktion in einem Fenster? Dann prüfe SetTimer?
    Ist es eine Funktion die in ausgeführt werden sol auch wenn Du gerade andere Operationen druchführst (asynchron), dann ist wohl ein eigener Thread notwendig.
    Ansonsten hast Du auch Sleep, allerdings legt das Deinen Thread komplett lahm.



  • ohhhja.. sorry für die if schleife 😉

    kam wolh zu stande weil ich die if bedinung in eine schleife packen wollte..

    ja besten dank, dass sind die ideen nach dennen ich gesucht hab!



  • ich wuerde ein timer erstellen den auf 1sec stellen - und immer die aktuelle zeit holen

    dann drueckst du auf ein knopf oder was auch immer {was den "countdown" ausloest}
    und setzt damit eine BOOL variable auf TRUE

    und in der timer funktion machst du ganz einfach ne abfrage if(flag == TRUE) merkst dir die zeit
    dann zeit+2min -

    und am ende vom timer, if(aktTime == wantTime) dann kannste direkt eine funktion aufrufen

    // untested

    // m_iWantSec und m_iWantMin im konstruktor auf 0;
    // m_Flag auf true sobald der countdown starten soll
    void CDingsbums::OnTimer(UINT nTimerID)
    {
        CTime time = CTime::GetCurrentTime(); 
        int iAktMin = time.GetMinute();
        int iAktSec = time.GetSecond();
        if(m_Flag == TRUE && m_iWantMin == 0)
        {
            m_iWantMin = (iAktMin+2);
            m_iWantSec = iAktSec;
        }
        if(m_iWantMin == iAktMin && m_iWantSec == iAktSec)
            StartFunction();
    }
    


  • Mr. Evil, was spricht gegen einen Timer von 2 Minuten?
    Dann muss man sich um nix kümmern. 😃



  • estartu schrieb:

    Mr. Evil, was spricht gegen einen Timer von 2 Minuten?
    Dann muss man sich um nix kümmern. 😃

    auch ne idee - nur wie kann man dann sagen das "erst dann" der countdown von 2 min starten soll ? der timer von 2 min laeuft dann ja unabhaengig von der taetigkeit des users - bei meiner loesung kann man den 2 min countdown direkt anstarten durch den flag



  • Ich hab nirgends was von nem Countdown gelesen. 😕



  • aber Countdown ist schon genau richtig hineininterpretiert!

    damit komm ich schon auf den richtigen weg..
    die funktion muss jetzt ja regelmässig aufgerufen werden!?



  • helmut a. schrieb:

    die funktion muss jetzt ja regelmässig aufgerufen werden!?

    Wenn du mit SetTimer arbeitest, wird OnTimer im vorgegebenen Abstand aufgerufen - es sei denn, dein PC ist arg ausgelastet. (Aber das bleibt erstmal außen vor.)



  • hast du da mal ne kleines codebeispiel wie du das realisierst?



  • Hinter dem Link, den ich gleich als erstet gepostet habe, versteckt sich ein Beispielprojekt mit einer Uhr.
    Das ist doch genau was du brauchst. 😕

    Frag bitte genauer, ich erkläre gern - aber gegen Code-Vorkauen habe ich eine Abneigung. 😉



  • kann ich verstehen!

    ich les mir das mal genau durch.. meld mich dann später.. 😉



  • jo..

    also der befehl:
    SetTimer(ID_CLOCK_TIMER,1000,NULL)

    Das erste argument ist die ID (die id ist doch einefach ein UINT oder?), das zweite die Zeit und das dritte dür die call back funktion!

    aber wo wid denn nun die uhrzeit aktualliert? also die funktion aufgerufen?

    bei dem zweiten codeauschnitt kann er die ersten 13 zeilen nicht darstellen, ich befürchte das steht da drin... 😞



  • helmut a. schrieb:

    jo..

    also der befehl:
    SetTimer(ID_CLOCK_TIMER,1000,NULL)

    Das erste argument ist die ID (die id ist doch einefach ein UINT oder?), das zweite die Zeit und das dritte dür die call back funktion!

    👍

    aber wo wid denn nun die uhrzeit aktualliert? also die funktion aufgerufen?

    bei dem zweiten codeauschnitt kann er die ersten 13 zeilen nicht darstellen, ich befürchte das steht da drin... 😞

    Ups, das ist ja gemein. 😮
    Du musst einen Handler für WM_TIMER erstellen.
    Der bekommt die Timer-ID als Parameter, wenn du also mehrere Timer laufen hast, kannst du gucken, welcher Timer das gerade ausgelöst hat.

    In der Funktion kannst du dann die Zeit aktualisieren.

    PS: Da hat wohl jemand im HTML gepfuscht.
    Die "Url" des Bildes ist der fehlende Text. 😮
    Kopier mal in Notepad und ersetze alle %20 durch Leerzeichen, dann isses halbwegs lesbar. 😉



  • hab das mal versucht "lesbar" zu machen..

    Unter einer Callback-Funktion versteht man eine vom Programmierer erstellte Funktion,
    die das Betriebssystem Windows direkt aufruft. Callback-Funktionen weisen spezielle Definitionen
    FCr die Argumente auf, je nachdem, welches Subsystem die Funktion aufruft und aus welchen Gr FCnden.
    Im Anschlu DF an die Funktionsdefinition haben Sie aber wieder freie Hand, wie Sie die Funktion gestalten
    m F6chten oder m FCssen. EDie Funktionsweise einer Callback-Funktion beruht darauf, da DF man die Adresse
    der Funktion als Argument an eine Windows-Funktion, die Callback- Funktionen als Argumente akzeptiert,FCbergibt.
    Nachdem Sie die Funktionsadresse an Windows FCbergeben haben, wird die Funktion jedesmal direkt aufgerufen,
    wenn Windows aufgrund der entsprechenden Bedingungen die Callback-Funktion aufrufen mu DF.
    EDas Timer-Ereignis der Uhr behandeln Nachdem Sie nun einen Timer gestartet haben,
    m FCssen Sie noch den Code aufnehmen, der die Timer-Nachrichten behandelt.
    Dazu f FChren Sie folgende Schritte aus: Nehmen Sie mit Hilfe des Klassen-Assistenten eine
    Variable f FCr das Steuerelement

    EIDC_STATICTIME

    CString

    Em_sTime

    Fügen Sie mit dem Klassen-Assistenten eine Funktion Für die Nachricht

    EWM_TIMER

    Für das Objekt

    ECTimerDlg

    hinzu.

    DCbernehmen Sie den Code aus Listing 4.2 in die Funktion

    EOnTimer

    EListing 4.2: Die Funktion OnTimer

    void CTimerDlg::OnTimer(UINT nIDEvent) // TODO: Code f FCr die Behandlungsroutine f FCr Nachrichten hier einf FCgen C2und/oder Standard aufrufen
    ///////////////////////
    // EIGENER CODE, ANFANG
    ///////////////////////
    // Aktuelle Zeit holen CBR E10:

    CTime curTime = CTime::GetCurrentTime(); CBR E11: CBR E12: // Aktuelle Zeit anzeigen CBR
    E1 : m_sTime.Format(

    Du musst einen Handler für WM_TIMER erstellen.

    das hab ich nicht so ganz verstanden..
    muss ich das überpüfen ob er denn ausgelöst hat, indem ich gucke ob ich die id übergeben bekomm?



  • alsi wie wertet man die nachricht WM_TIMER aus?



  • helmut a. schrieb:

    alsi wie wertet man die nachricht WM_TIMER aus?

    Hast du so ein OnTimer wie du oben gepostet hast?
    Was willst du denn alle Sekunde machen?

    Schreib in die Funktion (zu Demozwecken) doch mal:

    AfxMessageBox("Tick!");
    


  • ja mein problem ist das ich das man das ja irgendwie mit hilfe der Nachrichtenzuordnungstabellen des klassenassistenten die funktion WM_TIMER erstellt.

    ich arbeite aber mit visual studio 2005! und da weiß ich nicht so ganz wie ich die nachricht erstelle?!

    startet der die funktion ontimer eigentlich automatisch?

    nun sitz ich den ganzen tag davor nun peil ich auch gar nichts mehr..



  • also in der header hab ich nun:

    public:
    	unsigned int ID_TIMER;
    	void OnTimer(UINT nIDEvent);
    

    in der .cpp

    #define MYTIMER 10000
    bla...
    
    void CEmpfaengerDlg::OnBnClickedButton4()
    {	
    	machwas.InsertString(0,"set");
    	SetTimer(MYTIMER,1000,NULL); // 1000 ms
    
    }
    
    void CEmpfaengerDlg::OnTimer(UINT nIDEvent)
    {
    
    	machwas.InsertString(0,"juhu");
    
    }
    

    das müßte doch schon funktionieren oder?


Log in to reply