Autor Beitrag
BlackMatrix
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Sa 02.01.10 03:12 
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:

ausblenden C#-Quelltext
1:
2:
3:
4:
            Timer t1 = new Timer(); // Timer anlegen
            t1.Interval = 1000// Intervall festlegen, hier 100 ms           
            t1.Tick += new EventHandler(t1_Tick); // Eventhandler ezeugen der beim Timerablauf aufgerufen wird
            t1.Start(); // Timer starten


, 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Sa 02.01.10 13:58 
Ja schon, aber wenn ich mir Menge von Code z.B. auf msdn.microsoft.com/e...em.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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 02.01.10 14:11 
user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
Ja schon, aber wenn ich mir Menge von Code z.B. auf msdn.microsoft.com/e...em.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.
: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Sa 02.01.10 14:24 
user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
... 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.

user profile iconBlackMatrix hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 243
Erhaltene Danke: 1



BeitragVerfasst: Sa 02.01.10 14:36 
Danke euch beiden.

@JüTho:

Gut erklärt, jetzt macht der von msdn kopierte Code auch Sinn ;)