4 Stimmen

Wie ruft man in C++ eine Funktion einmal pro Tag zu einer bestimmten Zeit auf?

Nun muss ich herausfinden, wie man eine Funktion zu einem bestimmten Zeitpunkt aufrufen, wenn meine Anwendung ausgeführt wird.

Es wird wahrscheinlich in einer while-Schleife sein und die Zeit überprüfen, aber ich will nicht, dass es die Zeit jede Minute überprüft, aber ich will nicht, dass es die genaue Zeit verpasst, sagen wir 18:00.

Gibt es eine Möglichkeit, dies zu tun?

9voto

chrisaycock Punkte 34286

Wenn Sie eine bestimmte Funktion aus einem bereits laufenden Programm heraus aufrufen möchten, verwenden Sie Boosts Datum Uhrzeit Bibliothek und Asio .

#include <boost/date_time/gregorian/gregorian_types.hpp>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <boost/asio.hpp>

namespace gregorian = boost::gregorian;
namespace posix_time = boost::posix_time;
namespace asio = boost::asio;

asio::io_service io_service_;
asio::deadline_timer timer_ (io_service_);

Stellen Sie dann die Zeit ein. In diesem Beispiel wird eine Zeichenkette mit der gewünschten Uhrzeit verwendet, z. B. "18:00:00" (Beachten Sie, dass Boost für die Zeitstempel standardmäßig UTC verwendet!)

gregorian::date today = gregorian::day_clock::local_day();
posix_time::time_duration usertime = posix_time::duration_from_string(time)
posix_time::ptime expirationtime (today, usertime);

Stellen Sie nun den Timer so ein, dass er Folgendes aufruft foo() :

timer_.expires_at (expirationtime);
timer_.async_wait (foo);    // use Boost::bind() if you want a member function

Sie können so viele Timer hinzufügen, wie Sie möchten timer_ mit Hilfe der beiden obigen Codeschnipsel. Wenn alles fertig ist:

io_service_.run ();

Beachten Sie, dass dadurch der aktuelle Thread übernommen wird. Sie müssen also run() von einem anderen Thread aus, wenn Sie wollen, dass der Rest Ihres Programms weiterläuft. (Verwenden Sie natürlich Boosts Thema Bibliothek dafür.)

5voto

Steve Townsend Punkte 52288

EDIT: Ich weiß nicht, warum ich annahm, dies sei Windows. Ich sehe nirgends, dass dies so gesagt wird. Die API-Informationen unten gelten nur für Windows, aber das Prinzip ist dasselbe. Boost.Asio hat portable async Timer, wenn nicht Windows.

Windows Info : Wenn Ihre Anwendung startet, prüfen Sie das verbleibende Intervall bis zum gewünschten Ereignis und starten eine Timer Warteschlange Timer um zum richtigen Zeitpunkt zu platzen. Der Timer wird nach einem anfänglichen Intervall und dann wiederholt nach einem periodischen Intervall ausgelöst.

CreateTimerQueueTimer Funktion

Erzeugt einen Timer-Warteschlangen-Zeitgeber. Dieser Timer läuft zur angegebenen Fälligkeitszeit ab Zeit ab, dann nach jeder angegebenen Zeitraum. Wenn der Timer abläuft, wird die Callback-Funktion aufgerufen.

Es ist viel effizienter, dies ereignisgesteuert zu machen, als regelmäßig die Uhr zu überprüfen.

1voto

rerun Punkte 24318

Am besten wäre es, die Betriebssystem-Tools zu verwenden, die diese Funktion bereitstellen, und sich nur um das Schreiben der Funktion zu kümmern. Aber wenn das keine Option ist, müssen Sie die Uhr regelmäßig überprüfen, wie Sie gesagt haben.

0voto

Marcin Punkte 797

Sie könnten eine geplante Aufgabe in Ihrem System installieren, die Ihre Anwendung benachrichtigt. Wenn Ihr System ein Linux-System ist, können Sie zum Beispiel cron verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X