Alle 5 Minuten Aktion
-
-
Kann mir nicht schnell jemand sagen, wie ich minutes aktualisieren kann?
-
Pferdi schrieb:
Kann mir nicht schnell jemand sagen, wie ich minutes aktualisieren kann?
Sorry für die Ausdrucksweise aber...bist du doof oder nur unglaublich faul?
Hättest du auch nur einen Blick auf meinen Link geworfen, wäre es innerhalb von Sekunden klar gewesen.
time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime );
-
Icematix schrieb:
Pferdi schrieb:
Kann mir nicht schnell jemand sagen, wie ich minutes aktualisieren kann?
Sorry für die Ausdrucksweise aber...bist du doof oder nur unglaublich faul?
Hättest du auch nur einen Blick auf meinen Link geworfen, wäre es innerhalb von Sekunden klar gewesen.
time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime );Doch schon, so ähnlich hab ich's ausprobiert, nur meckert mein Compiler, wenn ich minutes als Zeiger verwende.
time_t actual; struct tm *minutes; time(&actual); while(true){ if(minutes.tm_min % 5 == 0){ cout << "5 Minuten vergangen" << std::endl; time(&minutes); minutes = localtime(&actual); } Sleep(1000); }Der Microsoft-Compiler sagt:
Links von ".tm_min" muss sich eine Klasse/Struktur/Union befinden. [if-Zeile] Typ ist 'tm *' Wollten Sie stattdessen '->' verwenden? 'time': Konvertierung des Parameters 1 von 'tm **' in 'time_t *' nicht möglich [time(&minutes);] Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
-
Sleep(1) ist auch eine Methode, die context switches künstlich in die Höhe zu treiben

Bevor du das jetzt ernsthaft so machst:
for(;;) { DoAction(); time_t rawtime; struct tm* timeinfo; time(&rawtime); timeinfo=localtime(&rawtime); Sleep((timeinfo->tm_min/5*5+5-timeinfo->tm_min)*60-timeinfo->tm_sec+1)*1000); }
-
Edit: time(&minutes); soll natürlich time(&actual); heißen, das hat sich schonmal erledigt.
-
Nuja, hab alle Fehler gefunden...
time_t actual; struct tm *minutes; time(&actual); minutes = localtime(&actual); while(true){ if(minutes->tm_min % 5 == 0){ cout << "5 Minuten vergangen" << std::endl; Sleep(58000); } time(&actual); minutes = localtime(&actual); Sleep(2000); }
-
und woher kommt die magic number Sleep(58000);?
-
Und dir ist schon klar, dass deine Aktion alle zwei Sekunden ausgeführt wird, wenn du nicht gerade in einer Fünferminute bist?
Edit: auch noch mal aufgedröselt:
Sleep(( //aktuelle Minute auf Fünfer abrunden timeinfo->tm_min/5*5 //eine Fünferminute weiter als ob wir aufgerundet hätten +5 //wir wollen nur die relative Zeit, also aktuelle Minuten wieder abziehen -timeinfo->tm_min) //das warn Minuten, also jetzt Sekunden *60- //verstrichene Sekunden der aktuellen Minute sind ja schon vergangen, können wir also beim Warten weglassen timeinfo->tm_sec //jeweils zur 01-Sekunde ausführen, um eventuellen Ungenauigkeiten aus dem Weg zu gehen (Sleep setzt dich z.B. bei 49:59 ab oder so) +1 //jetzt Millisekunden )*1000);
-
Pferdi schrieb:
Nuja, hab alle Fehler gefunden...
time_t actual; struct tm *minutes; time(&actual); minutes = localtime(&actual); while(true){ if(minutes->tm_min % 5 == 0){ cout << "5 Minuten vergangen" << std::endl; Sleep(58000); } time(&actual); minutes = localtime(&actual); Sleep(2000); }Ich fürchte, ich muss mich Icematix anschliessen und feststellen, dass Du irgendwie zu bequem bist, wirklich darüber nachzudenken. Warum wartest Du irgendeine Zeit ab und schaust dann, ob es so weit ist, statt einfach auszurechnen, wie viel Zeit noch zu warten ist? Mit time bekommst Du die aktuelle Uhrzeit und du weisst, wann Du Deine Aktion das nächste mal ausführen willst. Aus der Differenz ergibt sich die Zeit, wie lange Du noch warten musst. Ausprogrammieren werde ich Dir das aber nicht.
-
Die Sleep(58000) habe ich eingebaut, da der if-Zweig sonst solange ausgeführt wird, bis die Teilung durch minutes->tm_min nicht mehr möglich ist. Die Division ist in einer Minute sehr oft möglich, begrenzent ist die Sleep()-Funktion.
-
Wie waere es mit 'nem Cron-Job?
-
Entschuldigt meine gestrige Ungehobeltheit. Nun habe ich meinen Code nach euren Vorschlägen zurechtgebastelt (oder -kopiert).
time_t rawtime; struct tm* timeinfo; time(&rawtime); while(true){ time(&rawtime); timeinfo=localtime(&rawtime); Sleep(((timeinfo->tm_min/5*5+5-timeinfo->tm_min)*60-timeinfo->tm_sec+1)*1000); cout << "5 Minuten vergangen" << endl; }