C# :: Aufgabe #48 :: Lösung #4

6 Lösungen Lösungen öffentlich
#48

Stoppuhr mit Rundenzeiten

Anfänger - C# von Dome - 10.03.2013 um 23:36 Uhr
Erstellen Sie ein Programm, womit man die Zeit stoppen kann. Die Stoppuhr sollte mit einer beliebigen Taste anfangen die Zeit zu starten und danach mit einer beliebigen Taste eine weitere Runde einzuleiten. Die Stoppuhr sollte mit dem Druck auf ESC beendet werden.
#4
2 Kommentare
vote_ok
von gilbert (20 Punkte) - 10.03.2015 um 17:34 Uhr
Ich bin noch relativ frisch mit dem Programmieren und habe hier schon ein paar der Aufgaben gemacht. Aber auf diese Lösung bin ich besonders stolz, weil die Zeit live auf der Konsole ausgegeben wird und das war für mich eine echte Kopfnuss! Das Programm lastet die CPU ziemlich stark aus, weil ständig eine Schleife läuft. Das weiss ich (noch) nicht, wie man das besser macht, würde mich aber über konstruktive Kritik freuen! Die Kommentare sind auf Englisch, weil ich das einfach schöner finde und auch so gewohnt bin.
Und wenn jemand Fragen zum Code hat, einfach fragen. :)

Quellcode ausblenden C#-Code
using System;
using System.Diagnostics;

namespace Timer
{
	internal class Program
	{
		private static void Main(string[] args)
		{
			Stopwatch Time = new Stopwatch();
			ConsoleKeyInfo PressedKey = new ConsoleKeyInfo();

			int CountMyRound = 1;

			Console.WriteLine( "Press any key, to start timer." );
			PressedKey = Console.ReadKey();
			Time.Start();

			do//bee doo
			{
				Console.WriteLine( "Round {0} started", CountMyRound.ToString() );
				Console.WriteLine( "Press any key, to start another round. (Press 'Escape' to exit)" );

				/* this while-loop is executed, until a Key is pressed
				 * it puts the passed time out on the console with a following carriage return */
				while (!Console.KeyAvailable)
				{
					TimeSpan ElapsedTime = Time.Elapsed;
					string ElapsedTimeString = String.Format( "Round {0}: {1:00}:{2:00}:{3:00}:{4:000}", CountMyRound.ToString(),
					ElapsedTime.Hours, ElapsedTime.Minutes, ElapsedTime.Seconds, ElapsedTime.Milliseconds );
					Console.Write( ElapsedTimeString + "\r" );
				}

				PressedKey = Console.ReadKey();
				Console.WriteLine( "" );

				if (PressedKey.Key == ConsoleKey.Escape) break;
				else
				{
					Time.Stop();
					CountMyRound++;
					Time.Restart();
				}
			} while (PressedKey.Key != ConsoleKey.Escape);
		}
	}
}

Kommentare:

gilbert

Punkte: 20


1 Lösungen
2 Kommentare

#1
13.03.2015 um 11:46 Uhr
Die CPU-Last kann stark reduziert werden, indem man in die while-Schleife eine Zeile hinzufügt:

Quellcode ausblenden C#-Code
Thread.Sleep(1);


so wird die Ausgabe auf deer Konsole nur jede Millisekunde erneuert.
Die Schleife sieht dann ingefähr so aus, wobei es eigentlich egal ist, in welcher Zeile der Schleife pausiert wird:

Quellcode ausblenden C#-Code
while (!Console.KeyAvailable)
                {
                    TimeSpan ElapsedTime = Time.Elapsed;
                    string ElapsedTimeString = String.Format( "Round {0}: {1:00}:{2:00}:{3:00}:{4:000}", CountMyRound.ToString(),
                    ElapsedTime.Hours, ElapsedTime.Minutes, ElapsedTime.Seconds, ElapsedTime.Milliseconds );
                    Console.Write( ElapsedTimeString + "\r" );
                }
post_arrow
136 0

gilbert

Punkte: 20


1 Lösungen
2 Kommentare

#2
13.03.2015 um 11:48 Uhr
Die CPU-Last kann stark reduziert werden, indem man in die while-Schleife eine Zeile hinzufügt:

Quellcode ausblenden C#-Code
Thread.Sleep(1);


so wird die Ausgabe auf deer Konsole nur jede Millisekunde erneuert.
Die Schleife sieht dann ingefähr so aus, wobei es eigentlich egal ist, in welcher Zeile der Schleife pausiert wird:

Quellcode ausblenden C#-Code
while (!Console.KeyAvailable)
                {
                    TimeSpan ElapsedTime = Time.Elapsed;
                    string ElapsedTimeString = String.Format( "Round {0}: {1:00}:{2:00}:{3:00}:{4:000}", CountMyRound.ToString(),
                    ElapsedTime.Hours, ElapsedTime.Minutes, ElapsedTime.Seconds, ElapsedTime.Milliseconds );
                    Console.Write( ElapsedTimeString + "\r" );
                }


Man braucht für diese Methode nur noch:

Quellcode ausblenden C#-Code
using System.Threading;
post_arrow
137 0
Bitte melden Sie sich an um eine Kommentar zu schreiben.
Kommentar schreiben
2099183

Du scheinst einen AdBlocker zu nutzen. Ich würde mich freuen, wenn du ihn auf dieser Seite deaktivierst und dich davon überzeugst, dass die Werbung hier nicht störend ist.