Uhrzeit in eine Klasse integrieren?



  • Hallo!

    Vorweg: Ich lese schon ne ganze Weile rum und habe auch die MSDN bemüht. Aber das Vieh is sooo groß - vor allem wenn man nich genau weiß, was man eigentlich suchen muß.

    Ich habe ein C++ MFC-Programm. In diesem Programm fehlt eine Funktion. Die Funktion habe ich soweit fertig und die läuft auch. Da diese Funktion Daten an einen Webserver schickt, wäre es gut, den Funktionsaufruf von einer Art Timer abhängig zu machen (zum Beispiel alle 20 Minuten) - damit nicht bei 1000 Usern der Server zusammenbricht (so wie es jetzt ist, wird auf dem Webserver n Formular befüllt und der Inhalt dann in einer MySQL-Datenbank abgespeichert - daher muß ich das nun begrenzen). Die Stelle des Programms wird aber permanent durchlaufen - daher muß dieser Funktionsaufruf von einem Timer o.ä. abhängig sein.

    Frage:
    Wie kann ich in das bestehende Programm eine Klasse wie z.B. CTime integrieren, die innerhalb des Funktionsaufrufes in etwa folgendes tun soll:

    aktuelle Uhrzeit ermitteln (GetCurrentTime oder ähnlich)
    Variable = Stunden+Minuten
    VariableAlt = 0
    Konstante = 20
    
    //Und dann halt sowas wie
    
    If VariableAlt + Konstante > Variable dann {
    nix
    }
    else{
    Funktionsaufruf;
    VariableAlt = Variable;
    }
    

    Ich hoffe es ist deutlich geworden was ich eigentlich will. Bisher bekomme ich immer Fehlermeldungen beim Kompilieren wie

    f:\Programmpfad\dateiname.cpp(125): error C2352: 'ATL::CTime::GetHour::ATL::CTime::GetHour' : Unzulässiger Aufruf einer nicht statischen Memberfunktion

    usw.

    Komme aus eine völlig anderen Ecke - hab sonst mit C++ oder Java nix am Hut.
    Bin dankbar für jede Hilfe oder Link
    Grüße
    ComicHeld



  • Du kannst einfach die WM_TIMER Message benutzen.

    Mit
    SetTimer(1,1000,NULL);
    wird jede Sekunde eine Message WM_Timer ausgelöst.
    Den Timer beenden
    mit
    KillTimer(1);

    Die "1" bedeutet der Timer mit der Nummer 1 dann man ja mehrere laufen lassen kann.
    z.B.

    SetTimer(1,1000,NULL);
    SetTimer(2,1000,NULL);

    Startet 2 Timer. Einen mit der Nummer 1 und einen mit der Nummer 2

    Diese läßt sich in der OnTimer() funktion dann abfragen



  • Hi 🙂

    Erstmal: Vielen Dank für Deine Antwort!

    Hab nun zwei Stunden herumgebastelt und muß leider zugeben, dass ich es nicht zum laufen bekomme.

    Die MSDN sagt zu CWnd::SetTimer:

    void CMainFrame::OnTimer(UINT nIDEvent) 
    {
       MessageBeep(0xFFFFFFFF);   // Beep
    
       // Call base class handler.
       CMDIFrameWnd::OnTimer(nIDEvent);
    }
    

    Das kann ich so ned machen, weil der Funktionsaufruf nur ne Unteroutine sein soll, hhmm, kann ich schlecht erklären.

    Also in etwa so:

    void irgendwas::irgendwas (blabla* blabla2){
        if (connecting == false)
        {
            DestroySocket(sender);
            return;
        }
    //Jetzt würde ich den Timer initialisieren...
    SetTimer(1,1200000,NULL);
    //jetzt wird ne Funktion aufgerufen
    
        if (blablablablabla);
    
    //Funktion erledigt
    //hier muß der code If/else für den Timer hin
    
    if (Timer<1200000) {then
    nichts soll passieren}
    else {
    servercheck->update("www.meineseite.net",80,"/Verzeichnis/script.php?function=add&",sender->cur_server->GetAddress(),sender->cur_server->GetPort(),sender->cur_ser ver->GetListName(),sender->cur_server->GetUsers(),sender->cur_server->GetFiles());
            if (update){
                update->ResetFailedCount();
                theApp.progdlg->serverwnd.serverlistctrl.RefreshServer( update );
    KillTimer(1);
            }
    //hier ist der aufruf zuende
    

    Ich weiß - für euch ist das sicher nervig - aber leider bekomme ich den Teil nicht hin. Oder muß ich das ganz anders aufrufen?

    Einfach gesagt benötige ich nur ne grundsätzlich korrekte Syntax für den folgenden Bereich:

    if (Timer<1200000) {then
    nichts soll passieren}
    else {
    

    Sorry und Danke
    Greetz
    ComicHeld



  • Du brauchst den Timer nach SetTimer nicht aufrufen.
    Mit SetTimer wird er gestartet.
    Ist er abgelaufen wird die OnTimer mit dem Code darin automatisch aufgerufen.



  • Hat geklappt (auch wenn ich lange dran gestrickt hab *gg*)

    VIELEN DANK ! 🙂



  • Was soll das "then" hinter dem if eigentlich???


Anmelden zum Antworten