Funktion nur jede Xte Sekunde ausführen, der Rest des Programms muss weiterlaufen
-
Hallo!
Ich weiß ja das Standard C++ so etwas nicht anbietet, aber angenommen ich muss jede Sekunde eine Funktion ausführen, aber der Rest des Programms lauf normal weiterlaufen, wie bekomme ich das geregelt?
-
Wichtig! Das ganze darf nicht plattformabhängig sein!
-
neuesgebiet schrieb:
Wichtig! Das ganze darf nicht plattformabhängig sein!
Unter Berücksichtigung dieser Einschränkung gar nicht.
-
Oha, dann reicht mir auch eine Lösung für Linux und Windows, wird eben #ifdef verwendet
-
Er könnte doch einen Thread nehmen, der nach seiner Tätigkeit immer eine Sekunde schläft. Sowas läßt sich mit Boost realisieren und ist damit schon plattformunabhängig. Falls nicht (Hume weiß es sicher besser
), bitte ich um Richtigstellung.
-
Das sähe dann in etwa so aus:
#include <boost/thread/thread.hpp> #include <boost/thread/xtime.hpp> #include <iostream> void my_func() { std::cout << "my_func" << std::endl; } struct my_thread { private: bool &interrupted; public: my_thread(bool &i) : interrupted(i) { } void operator()() { while(!interrupted) { boost::xtime xt; boost::xtime_get(&xt, boost::TIME_UTC); // holt aktuelle Zeit ++xt.sec; // setzt den timer auf eine Sekunde später my_func(); // Funktion aufrufen boost::thread::sleep(xt); // warten bis zum gerade gemerkten Zeitpunkt } } }; int main() { bool interrupt_thread = false; my_thread mth(interrupt_thread); // ... Rest des Programms. In diesem Fall im wesentlichen 5 Sekunden warten. std::cout << "main begin" << std::endl; boost::thread th(mth); // Hier wird der andere Thread gestartet boost::xtime xt; boost::xtime_get(&xt, boost::TIME_UTC); xt.sec += 5; boost::thread::sleep(xt); // Für eine konsistente Beendigung des anderen Threads // vorhin übergebenes abbruchsflag setzen, danach thread joinen. interrupt_thread = true; th.join(); std::cout << "main end" << std::endl; }
-
Cocaine schrieb:
Er könnte doch einen Thread nehmen, der nach seiner Tätigkeit immer eine Sekunde schläft. Sowas läßt sich mit Boost realisieren und ist damit schon plattformunabhängig. Falls nicht (Hume weiß es sicher besser
), bitte ich um Richtigstellung.
Portabel aber nicht platformunabhängig. Auch Boost::Thread stellt anforderungen an die Platform. Auf einem System das keine Threads unterstützt wirst du mit Boost::Thread wenig anfangen können.
Nur darauf bezog sich meine Aussage. Ich wollte damit nicht sagen, dass es keine portablen Thread-Bibliotheken gibt.
-
Ok. Ich habe die beiden Begriffe fälschlicherweise synonym verwendet. Vielleicht der Thread-Eröffner ja auch, und in Wirklichkeit reicht ihm eine portable Version.
-
Also welche libs muss ich linken bei diesem Beispiel Code 0xdeadbeef vor allem welche kompiler optionen brauche ich ??
Benutze Dev-Cpp und bekomme immer den Fehler Komponente nicht gefunden
Also im Windows nicht im Compiler
-
i386 = 100 % Power schrieb:
Also welche libs muss ich linken bei diesem Beispiel Code 0xdeadbeef vor allem welche kompiler optionen brauche ich ??
Benutze Dev-Cpp und bekomme immer den Fehler Komponente nicht gefunden
Also im Windows nicht im Compilerwww.boost.org
dann download...include directory:
C:\Boost\include\boost-1_32lib directory:
C:\Boost\libcu
-
Das weiss ich auch nur gibt es bei mir immer Fehler beim kompilieren undefinied reference oder so was mache ich falsch fehlt mir eine lib ?
-
undefined reference scheint eher ein Link-Problem und kein Compile-Problem zu sein. Dir fehlt die Library selbst, also die *.lib bzw. beim gcc heißt es glaub ich *.a. Auch die DLL fehlt dir entsprechend. Du mußt erstmal die boost-Binaries bauen lassen, mit dem jam-Tool. Steht alles auf der boost-Website.