Programmunterbrechung



  • Hallo!
    Also ich hab folgendes Problem:
    Ich muss in bestimmten Intervallen daten abfragen, die weiterverarbeitet werden sollen.
    Ich habe es jetzt wie folgt gelöst:
    vor beginn der bearbeitung speichere ich die aktuelle systemzeit ab. Damnach arbeitet das programm und an dem punkt wo es warten soll steht eine leere schleife, die immerwieder das abgespeicherte Datum mit dem aktuellen vergleicht und bei einer beliebigen differenz (sekunden) endet. Das Problem ist nur, dass die Rechnerauslastung dabei auf 100% steigt, was ich persönlich zimlich unschön finde.
    Gibts da ne bessere Methode?

    void SetDeelay(void);           //
        void Deelay(unsigned int);      //
    
    //[...]
    
    void CWetterstation::SetDeelay()
    {
        iDeelay = (unsigned)time(NULL);
    }
    
    void CWetterstation::Deelay(unsigned int iSekunden)
    {
        while((time(NULL)-iDeelay)<iSekunden);
    }
    
    //[...]
            cFGTWetter.SetDeelay();
            cFGTWetter.SetTime();
            cFGTWetter.GetDateAndTime(DateTime);
            cFGTWetter.GettAllData();
            cFGTWetter.Windrichtung(WindRichtung);
            cFGTWetter.SaveData();
    
            cout << endl;
    
            cout    <<    endl    <<    DateTime
                    <<    "*****************************"<< endl;
            cout    <<    "Helligkeit:\t\t"       << cFGTWetter.HoleHelligkeit()    << endl;
            cout    <<    "Luftdruck:\t\t"        << cFGTWetter.HoleDruck()     << endl;
            cout    <<    "Luftfeuchte:\t\t"      << cFGTWetter.HoleFeuchte()       << endl;
            cout    <<    "Niederschlag:\t\t"     << cFGTWetter.HoleNieder()        << endl;
            cout    <<    "Temperatur:\t\t"       << cFGTWetter.HoleTemp()      << endl;
            cout    <<    "Windgeschwindigkeit:\t"<< cFGTWetter.HoleGeschw()        << endl;
            cout    <<    "Windrichtung:\t\t"     << WindRichtung                   << endl;
            cout    <<    "*****************************" <<    endl;
            cFGTWetter.Deelay(10);
    


  • deine schleife ist nicht gut: die frisst zuviel CPU time

    nimm eine OS abhaengige Funktion: Sleep() unter Windows und nanosleep() unter Linux



  • Hab ich doch oben geschrieben, Shade :p
    Sleep kann ich leider nicht verwenden. Das Programm soll warten, sofern von anfang der abfrage bis ende der berechnung noch keine xx Sekunden vergangen sind. sleep friert mir das system komplett ein.
    Und da sleep soweit ich weis eh Windoof ist, fllts raus, da später alles auf DOS Laufen muss __



    1. ist unter DOS die Rechnerauslastung relativ egal
    2. gibts auch unter DOS sleep() oder war's delay(), guck mal in die dos.h


  • 1. hadde ich mir auch gedacht, nur unter windoof zum testen nervt das
    2. ok, werd ich ma nachsehen 🙂
    3. Kann ich sie zwar nicht benutzen wie ich wollte, aber ich glaub ich hab nen indirekten Weg gefunden 😉



  • Original erstellt von THE_FreaK:
    Das Programm soll warten, sofern von anfang der abfrage bis ende der berechnung noch keine xx Sekunden vergangen sind.

    Wenn die Berechnung abgeschlossen ist holst du dir deine Startzeit, errechnest daraus die noch zu wartende Zeit und Sleepst die dann! Oder habe ich da was falsch verstanden?



  • Ja, so hadde ich mir das nachher auch gedacht __
    Richtig verstanden 😉


Anmelden zum Antworten