Seite 1 von 1
Aktion zu einer bestimmten Zeit durchführen
Verfasst: 14. Juli 2011 14:34
von sooofunky
Noch eine andere Frage:
Möchte um Mitternacht eine bestimmte Aktion durchführen. Muss ich dazu QTimer verwenden und alle paar Minuten nachsehen ob es schon Mitternacht ist?
Danke
Verfasst: 14. Juli 2011 15:38
von RHBaum
Das ist komplexer als es eigentlich klingt.
wie willst du deinen Prozess "schlafen" legen, ohne das er zu viel ressourcen belegt ?
Standard fuer solche Rangehensweissen ist:
Das betriebssystem hat einen Prozess (daemon dienst) der standig laeuft und ressourcen einmalig beansprucht. Dieser fuehrt aus einer Tabelle Programme zu einer bestimmten zeit aus.
Das programm selber macht nur noch das was es soll ... und beendet sich selber wieder wenns fertig ist.
Das ist die einfachste und unproblematischste Loesung.
Suche nach "Cronjobs", gibts unter Posix(Linux), SystemV und windows usw.
Unter windows findet man das unter "geplante Tasks" aus der batch raus geht auch der at befehl
Wenn du sowas selber machen willst:
Unter linux am besten nen daemon, weil der wird ja kein userinterface und kein terminal haben sollen ...
dann mit sowenig wie moeglich aufwand einfach Uhrzeit abfragen und bei bedarf deine funktion ausfuehren ....
unter windows wie obig wegens nichtvorhandenen userinterface sollte das ding am besten nen service sein ...
wenn du service / oder daemon programmierst, bekommst ueber start/stop funktionalitaet deines startsystems, oder die service -Schnittstelle schon mit, wenn sich das ding zu beenden hat, und kannst auch noch aufraeumen.
Machst du nurn einfaches programm, das sich irgendwo "versteckt", dann musst dich selber irgendwo einklicken, damit den system.shutdown mitbekommst .. ansonsten bekommst schlimmstenfalls nen kill signal und danach gleich die ressourcen unterm popo weggezogen, was auf geoffnete ressourcen lustige effekte haben koennte ...
Ausserdem nervts immer, wenn windows beim runterfahren haengt, und die zig sek wartet, nachdem es dir den vorsichtigen kill geschickt hat und dann dich richtig killen will ...
Also nen programm ohne Userschnittstelle sauber runterfahren ist schon ned einfach.
Besser dann ne simple nutzerschnittstelle über nen Trayicon, ueber des fensterhandler bekommst den systemshutdown auch mit ...
Aber GUI Schnittstellen bekommst generell auch nur, wenn eingeloggt bist ... soll dein Prozess auch triggern, wenn kein nutzer eingeloggt ist, also windows / linux vorm login steht (serverbetrieb etc) dann kommst nur ueber dienste/daemons weiter ...
Ciao ....
Verfasst: 14. Juli 2011 15:43
von sooofunky
Danke für die ausführliche Antwort. Eigentlich sollen nur um 0:00h neue Daten in einem Widget angezeigt werden. Dachte nicht, dass dies so aufwendig ist.
Verfasst: 14. Juli 2011 15:52
von RHBaum
Naja, wenn dein "Widget" zu nem programm gehoert ....
und wenn das Programm geschlossen wird, dann soll es nix tun ...
Dann ist es eher trivial ...
Problem was ich eher beschrieben hab, ist sowas laufen zu lassen und sauber zu beenden, ohne useraktion und ohne ne Eventschleife. Das ist dann eher bei Dir ned der fall
Einfachster weg ...
QTimer aufziehen. Uhrzeit abfragen. Wenn 0:00 dann irgend nen Slot triggern ^^
Mit bissi magie und tricks kannst da noch performance schinden ...
einfach die restzeit berechnen zu 0:00 und bei grossen abstaenden grosse intervale, und wenn nahe an die 0:00 kommst, die intervalle runtersetzen ...
QTimer im 1sek bereich sind total unkritisch ... wenn sowieso nur auf +- 1 sek genau brauchst, dann brauchst eigentlich gar keinen Aufwand treiben ^^
und deine RTC wird im regelfall ned viel genauer sein, sei denn du hasst irgendwas genaueres drann ... also nen funkuhr-modul oder 1a konnection zu nem klasse 1 Zeitserver, nur dann lohnt es sich eigentlich genauer zu werden ...
Ciao ...