SaschaF
Anmeldungsdatum: 9. Dezember 2005
Beiträge: Zähle...
|
Hey, ich habe folgendes Problem. Ich habe ein Programm das im hintergund abläuft. Wenn jetzt eine bestimmte Taste gedrückt wird dann soll das Programm dies registrieren (dieser Teil klappt alles usw). Nur die auszuführende Aktion soll nicht sofort sondern erst 5 sec später ausgeführt werden. Wie mache ich das? Also hier nochmal ein bsp. Der user drückt die Taste "t". Dann soll das System neu gestartet werden, baer erst nach 5 oder 10 sekunden. Doch wenn der user in der Zeit die Taste "t" nochmal drückt soll dies nicht passieren. Ich hatte das angefangen so umzusetzen: erst ein fork() um den prozess zu duplizieren, dann eine abfrage ob ich der kindprozess bin und wenn ja dann sleep(5) damit das kind 5 sekunden ruht und der andere prozess weiter läuft damit es einen eventuelles nochmaliges drücken von "t" mitbekommt. nachdem sleep(5) vorbei ist kommt halt shutdown befehl usw und im eltern prozess kommt aber ein kill(pid,9) vor falls t nochmal gedrückt wird. Kann man das so machen? geht das noch anders? eleganter? bzw das kill funktioniert nicht. Er killt den prozess nicht. MfG
|
Gizmo
Anmeldungsdatum: 6. Januar 2005
Beiträge: 377
|
In welcher Programmiersprache arbeitest du, C/C++ oder was anderes?
|
haraldkl
Anmeldungsdatum: 21. Juli 2005
Beiträge: 1903
Wohnort: Würselen
|
Hi, also ich würde einen Thread starten, in dem erstmal 5s gewartet wird und dann die Aktion, die du gerne hättest ausgeführt wird. Anders könntest du dir auch einen Alarm stellen, und dann entsprechend auf SIGALRM reagieren. Aber ich denke mit den Threads bist du flexibler. 😉
|
SaschaF
(Themenstarter)
Anmeldungsdatum: 9. Dezember 2005
Beiträge: 61
|
ja ich vergass c/c++ das mit dem thread ist ja genau das was ich mit dem fork() mache, nur das mir da ein prozess angelegt wird, das problem ist aber nur das ich den thread ja killen muss bzw die 5 sec verlängern muss wenn nochmal auf "t" gedrückt wird und das weiss ich nicht wie 😀 das killen geht nicht so richtig
|
Apollon
Anmeldungsdatum: 27. Oktober 2004
Beiträge: 724
Wohnort: Darmstadt
|
|
SaschaF
(Themenstarter)
Anmeldungsdatum: 9. Dezember 2005
Beiträge: 61
|
sorry aber gettimeofday() nützt mir absolut nix in diesem zusammenhang nicht so wie der rest vom prog läuf
|
haraldkl
Anmeldungsdatum: 21. Juli 2005
Beiträge: 1903
Wohnort: Würselen
|
OK, also schau dir doch bitte mal das Beispiel dazu an. Wenn du bei erneutem Drücken von t die Zeit verlängern willst bietet es sich wahrscheinlich an mit einem durch ein mutex geschützten Flag zu arbeiten. Wird t gedrückt, während bereits ein Thread läuft, so wird der Flag gesetzt. Der Thread mit dem sleep schaut dann nach Ablauf der Wartezeit da nach, ob t erneut gedrückt wurde. Setzt den Flag zurück und wartet nochmal. Man kann sich natürlich auch merken wie oft t gedrückt wurde, und den Thread das entsprechend abarbeiten lassen. Der Thread beendet sich selbst sobald er dann auf ein return stösst. Du kannst natürlich auch mit lauter unabhängigen Prozessen und Signalen arbeiten, ist ja nur ein Vorschlag von mir. 😉 Vielleicht hab ich auch nicht ganz verstanden, was du machen willst.
|
dEMaStEr
Anmeldungsdatum: 24. November 2005
Beiträge: 146
Wohnort: Aspach
|
Ich würde mir eine Methode namens Stop5sec machen die die jetzige Zeit in sec. erfasst. Dann zählst einfach eine While(true) schleife und checkst bei jedem durchlauf ob 5 sec. um sind. Dann ja raus aus der Methode wenn nein weiter mit der Schleife. Zur Funktion Time findest du hier etwas: http://cplusplus.com/ref/ctime/time.html
|
dahane
Anmeldungsdatum: 23. Oktober 2004
Beiträge: 326
Wohnort: Hamburg
|
Wie wärs mit:
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
|
SaschaF
(Themenstarter)
Anmeldungsdatum: 9. Dezember 2005
Beiträge: 61
|
so es geht habe es über das Thread modell gelöst... starte einfach einen thread der 5 sekunden schläft... dann checkt er ob nicht noch ein weiterer thread gestartet wurde wenn ja dann beendet er sich einfach und wenn nein fährt dieser thread das system runter ist besser und praktischer da die threads einfacher kommunizieren können und das prozessmodell wohl einfach zu übertrieben ist für so eine kleinigkeit. sleep() alleine nützt mir da nix da ja sonst mein hauptprogramm 5 sekunden schläft und dann nicht weiter auf andere sachen reagiert... MfG
|
Apollon
Anmeldungsdatum: 27. Oktober 2004
Beiträge: 724
Wohnort: Darmstadt
|
Wofuer braucht man hier einen Thread?! Wo ist das Problem den Zeitpunkt der Eingabe festzuhalten, in einer Schleife die aktuelle Zeit ermitteln und dann die Differenz zu bilden? Sollte diese >= 5 sec. sein, die gewuenschte Aktion ausfuehren. Natuerlich sollte man in der Schleife auf ein moegliches Abbruchereigniss testen und gegebenfalls abbrechen.
|
dEMaStEr
Anmeldungsdatum: 24. November 2005
Beiträge: 146
Wohnort: Aspach
|
Es gibt auch noch die Funktion Sleep. Ist glaub auch bei Time dabei. Braucht man einfach nur die Funktion + Parameter in sec. eingeben und das Progg wartet eine gewisse Zeit an dieser stelle. Aber er hats ja jetzt schon gelöst.
|
SaschaF
(Themenstarter)
Anmeldungsdatum: 9. Dezember 2005
Beiträge: 61
|
sleep wurde doch schon erwähnt 😀 und ich benutze auch sleep doch nur in verbindung mit threads denn wenn ich sleep in meinem programm aufrufe schläft das ganze programm und das soll und darf es ja nicht 😀 auf jedenfall gehts jetzt und ist super so wie ich es wollte 😉
|
haraldkl
Anmeldungsdatum: 21. Juli 2005
Beiträge: 1903
Wohnort: Würselen
|
SaschaF hat geschrieben:
ist besser und praktischer da die threads einfacher kommunizieren können und das prozessmodell wohl einfach zu übertrieben ist für so eine kleinigkeit.
Ganz deiner Meinung 😉 Für die übrigen, ein Thread ist deshalb nötig, da das Programm, wenn ich es richtig verstanden habe auch weiterhin noch auf Eingaben reagieren soll und seine bisherigen Aufgaben auch weiter wahrnehmen soll. Durch ein einfaches sleep im "Hauptprogramm" ist dieses nicht möglich. Wenn ansonsten keine weiteren Fragen mehr bleiben, bitte den Thread noch als gelöst markieren. Danke! 😀
|
Apollon
Anmeldungsdatum: 27. Oktober 2004
Beiträge: 724
Wohnort: Darmstadt
|
Ein Thread ist ueberhaupt _nicht_ noetig. Aber sei's drum.
|