Entwickler-Ecke
Basistechnologien - Timer im Konsolenprogramm?
BlackMatrix - Sa 02.01.10 03:12
Titel: Timer im Konsolenprogramm?
Schönen guten Abend.
Ich durchlaufe eine Forschleife in meinem Programm und dabei wird mit jedem Durchlauf immer eine neue Zeit in Sekunden ermittelt.
Nun soll beim 1. Durchlauf der Forschleife ein Timer gestartet werden, der pro Sekunde meine Zeit in Sekunden um eins verringert.
Beim 2. Durchlauf soll nun geprüft werden, ob die verbliebene Zeit des Timer, kleiner ist, als die nun ermittelte Zeit. Falls ja, soll der Timer auf den neu ermittelten Zeitwert in Sekunden zurückgesetzt werden und soll wieder weiter runterzählen.
als Windows Formsanwung wäre dies kein Problem:
C#-Quelltext
1: 2: 3: 4:
| Timer t1 = new Timer(); t1.Interval = 1000; t1.Tick += new EventHandler(t1_Tick); t1.Start(); |
, jedoch wie realisiere ich dies als Konsolenprogramm?
Mein Ansatz gänge über das ermitteln der Uhrzeiten, um dann die Differenz von dem Sekundenwert abzuziehen und dann zu verlgeichen ob der Wert kleiner ist. Finde ich aber persönlich ziemlich umständlich, gibt es eine bessere, einfacherer, schnellere Möglichkeit?
MfG BlackMatrix
JüTho - Sa 02.01.10 12:00
Hallo,
du solltest dir angewöhnen, selbständig in der SDK-Doku/MSDN/Hilfe zu blättern. Dort bekommt häufig schneller Lösungen als in Foren. In diesem Fall wirst du feststellen, dass es drei Timer-Varianten gibt, je nach Anwendungszweck. Du musst dir also den passenden (wahrscheinlich den aus System.Timers) heraussuchen; Achtung: das ausgelöste Ereignis heißt Elapsed.
Gruß Jürgen
BlackMatrix - Sa 02.01.10 13:58
Ja schon, aber wenn ich mir Menge von Code z.B. auf
http://msdn.microsoft.com/en-us/library/system.timers.timer.aspx
anschaue, dann erreiche ich mein Ziel glaube ich schneller, wenn ich die aktuelle Zeit von der (in dem vorherigen Durchlauf ermittelten) Zeit subtrahiere.
Ich kann vielleicht mit dem Begriff Timer noch nichts so richtig anfangen. Ein Zeitzähler, der die verstrichene Zeit ermittelt, ist wohl kein Timer?
Kha - Sa 02.01.10 14:11
:shock:?
Ist doch quasi genau der gleiche Code wie in deinem ersten Posting?
Wenn du bei deiner Schleife bleibst, solltest du aber überlegen, ein
Thread.Sleep mit vielleicht 100ms einzubauen, um die CPU-Belastung niedrig zu halten.
JüTho - Sa 02.01.10 14:24
BlackMatrix hat folgendes geschrieben : |
... dann erreiche ich mein Ziel glaube ich schneller, wenn ich die aktuelle Zeit von der (in dem vorherigen Durchlauf ermittelten) Zeit subtrahiere. |
Das ist auch meine Vermutung. Aber weil du dein Verfahren unter WinForms anscheinend schon fertig hattest, wollte ich diese Diskussion nicht lostreten.
BlackMatrix hat folgendes geschrieben : |
Ich kann vielleicht mit dem Begriff Timer noch nichts so richtig anfangen. Ein Zeitzähler, der die verstrichene Zeit ermittelt, ist wohl kein Timer? |
Richtig. Ein Timer ist etwas, was im Arbeitsspeicher sozusagen selbständig rumhängt - ohne offensichtliche (!) Verbindung mit deinem Programm (abgesehen natürlich vom Verweis des Programms auf diesen Timer). Je nach Art der Konstruktion ist er zunächst inaktiv (disabled, enabled=false). Wenn du den Timer startest (Aufruf der Start-Methode, enabled=true), dann passt er "nur" auf. Jeweils nach Ablauf der eingestellten Zeit (z.B. nach 1000 msec) meldet er sich und löst das entsprechende Ereignis aus. Dann wird die dazu vorgesehene Methode ausgeführt; danach passt er wieder auf und wartet erneut auf den Ablauf der Zeit.
Wenn die Methode nur einmal ausgeführt werden soll, muss sie Timer.Enabled auf false setzen.
Du kannst jederzeit die aktuelle Uhrzeit mit DateTime.Now holen. Ein übliches Verfahren ist es, am Anfang einer Methode die Startzeit zu notieren, am Ende einer Methode die Schlusszeit und dann die Differenz als TimeSpan zu berechnen. Außerdem gibt es für ähnliche Aufgaben Environment.TickCount.
Ich glaube, es gibt auch die Zeit, wann das Programm gestartet wurde; aber das fällt mir im Moment nicht ein, und ich finde es in der Hilfe nicht.
Ich hoffe, das macht es etwas klarer. Mehr Informationen findest du natürlich in der
SDK-Doku/MSDN/Hilfe.
Gruß Jürgen
PS. In der Theorie sind meine Erläuterungen vermutlich sehr ungenau. Ich hoffe aber, dass sie für die Praxis hilfreich sind.
BlackMatrix - Sa 02.01.10 14:36
Danke euch beiden.
@JüTho:
Gut erklärt, jetzt macht der von msdn kopierte Code auch Sinn ;)
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!