Timer event
-
Hey ,
ich habe folgendes Problem :
Ich moechte einen Wert einer Variable zb um 5 fuer 10 minuten hochsetzen und nach 10 min wiede um 5 senken. Das Problem ist das Der Quellcode sehr gross ist und das Programm noch weiter laufen soll und nicht 10 minuten warten soll und man in dieser Zeit nichts machen kann. ich brauche irgendwie eine funktion die immer wieder angesprungen wird und ueberprueft ob die Zeit um ist. Habt ihr eine Idee wie man das anstellt. Also der Quellcode ist zu gross um ihn in 2 Threads zu packen... Hoffe ihr koennt mir helfen
-
Timer-Events hlefen dir vll wenn du bereits einen Event-Loop stehen hast. Ist das nicht der Fall brauchst du Threads, einen thread zu starten der regelmäßig Variablen hpochzählt ist auch bei enorm großem Sourcecode kein Problem.
Allerdings ist das hier wohl etwas OT, Timer-Events ist OS-API genauso wie threads und eine generelle Lösung findest du wohl geeigneterweise im "Rund um die Programmierung".
-
Wie wuerde sowas denn mit threads aussehen ? Also das mit den Threads habe ich mir anders vorgestellt naemlich das ich den gesamten Quellcode in einen Thread packen muss und die zeit steuerung in den anderen oder wie sieht das ganze aus
-
Du startest am anfang einen Thread der eine funktion ähnlich folgender ausführt:
void timeed() { bool inc(true); for(;;) { global_var += inc ? 5 : -5; inc = !inc; sleep(10); } }Wobei du da noch mit locking aufpassen musst gegebenenfalls.
-
Dann haengt das ganze doch in einer For schleife und der Programm Fluss wird beeintraechtigt oder etwa nicht ? kannst du es vielleicht etwas genauer erklaeren habe damit noch nicht allzuviel gemacht.
-
void timeed() { bool inc(true); for(;;) { global_var += inc ? 5 : -5; inc = !inc; sleep(10); //hier wird der Thread schlafen gelegt und benötigt somit zwischenzeitlich keine resourcen } }Du musst natürlichden thread erstmal starten. Da das aber von OS & Bibliotek abhängig ist kann dir hier keiner /die/ Lösung geben. Das starten des Threads und das Locking (die Vorkehrung dass die Variable nicht von 2 Threads gleichzeitig geändert wird) musst du also entsprechend selbst ergänzen.
Der Thread läuft immer in der Schleife, erhöht/erniedrigt die Variable und legt sich dann erstmal wieder schlafen. Dadurch braucht er auch erstmal keine CPU-Zeit mehr. Das Hauptprogramm läuft unabhängig davon weiter
-
Hoert sich alles sehr schwierig an , hast du nen Link fuer mich wo das Ganze schritt fuer schritt erklaert wird ?
-
Toa schrieb:
Hoert sich alles sehr schwierig an , hast du nen Link fuer mich wo das Ganze schritt fuer schritt erklaert wird ?
Ich hab einen:
-
Perfect danke , eine frage noch wie schaffe ich es das der t1 thread 10 minuten durchlaueft ? Also in t1 soll der wert fuer 10 min um 5 angehoben werden
eventuell so ?
#include <iostream> #include <boost/thread/thread.hpp> using namespace std; void foo() { int var; var + 5 ; sleep (10 min); var - 5 ; } int main() { boost::thread t1(&foo); bar(); }wuerde das so klappen ?
-
Das hat dir darthdespotism doch oben gezeigt

-
Nur das Sleep in Millisekunden angegeben wird oder etwa nicht also sind es bei ihm nur 10 millisekunden keine 10 minuten ausserdem wird der wert auch wieder nicht rumtergesetzt oder ?
-
void timeed() { bool inc(true); for(;;) { global_var += inc ? 5 : -5; ///Wenn inc true ist, wert um 5 erhöhen, sonst um 5 senken. inc = !inc; //Inc auf den jeweils anderen wert setzen (true -> false & false -> true) sleep(10); //hier wird der Thread schlafen gelegt und benötigt somit zwischenzeitlich keine resourcen } }Und ja, die zeit war in milisekunden angegeben, aber so schwer wird das umrechnen ja nicht sein, oder?

-
Also mal denkhilfe:
1 Sek: 1000Millsekunden
1 Min: 60 Sekunden10 Min ... na??? kommst drauf??
10*1000*60= 600000 millsekunden.. ui das war schwer;)

-
Hui, wie fein. Threads ohne Synchronisierung.
Tip: lass das mit den Threads, und sieh zu dass du es anders gebacken bekommst.
-
Also das klappt so alles nichts , bei boost threading muss man irgendwelche libs und files einbinden die zu allem übel auch noch falsche Header haben und alles doof .. Will einfach nicht klappen jemand anderes eine Idee
-
Toa schrieb:
Also das klappt so alles nichts , bei boost threading muss man irgendwelche libs und files einbinden die zu allem übel auch noch falsche Header haben und alles doof .. Will einfach nicht klappen jemand anderes eine Idee
...für Boost.thread musst man libboost_thread linken und boost/thread.hpp einbinden. Wo ist da das Problem? Oo
-
Woher bekomm ich das hab ma gegoogelt und da bekomm ich ein mega pack an files und wenn ich die Thread linke muss die wiederrum mit einer Config gelinkt sein etc
-
Toa schrieb:
Woher bekomm ich das hab ma gegoogelt und da bekomm ich ein mega pack an files und wenn ich die Thread linke muss die wiederrum mit einer Config gelinkt sein etc
Es gibt eine config.hpp, aber an der musste ich bisher weder was verändern, noch die explizit dazulinken.
Am besten liest du dir mal die Anleitung durch wie man boost unter windows kompiliert und benutzt: http://boost.org/more/getting_started/windows.html
-
Das klappt bei mir alles nicht schon recht nicht mit #include < > ich muss " nehmen damit er überhaupt die thread file findet und dann hat er Probleme die config und anderen files zu finden
-
Du musst den Ordner mit den boost:: Headerns schon zum Include-Path hinzufügen.
-
Reicht es denn nicht wenn die die thread.hpp include die anderen files sind doch in der thread.hpp includet ...
..Edit : kannst du vielleicht ein leeres Projekt machen die boost files adden und hochladen ? das wäre super weil bei mir will und will es nicht klappen