Autor Beitrag
SiickneZz
Hält's aus hier
Beiträge: 1



BeitragVerfasst: So 10.09.17 20:45 
Hallo,

ich will eine Schleife schreiben die abbricht, wenn entweder die "Enter" Taste gedrückt wird oder eine Anzahl an Millisekunden vergangen ist.
Ich habe beides einzeln bereits versucht und das hat auch funktioniert allerdings wenn ich beides verschmelze funktioniert es nicht mehr.


ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
static internal void Stopp(string Meldung, int Msek)
        {
            Msek = 3000//Testwert
            int abbruch = Environment.TickCount + Msek;
            Console.WriteLine($"{Meldung} \n\t - Return Taste - oder {Msek} Millisekunden ({(double)Msek / 1000} Sekunden) warten!");
            //while (Console.ReadKey().Key != ConsoleKey.Enter && abbruch > Environment.TickCount) { }  // Bricht nur bei Enter ab

            //while (true) { if (abbruch < Environment.TickCount) { return; } }                  // Nur zum Test, Bricht nach x msek ab

            while (Console.ReadKey().Key != ConsoleKey.Enter ) { if (abbruch < Environment.TickCount) { return; } } // Bricht nur bei Enter ab
        }


Vielen Dank für eure Hilfe!
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1282
Erhaltene Danke: 182

Windows 11 x64 Pro
C# (Visual Studio Preview)
BeitragVerfasst: So 10.09.17 21:23 
Dein Problem ist, dass die while-Schleife nicht wirklich läuft.
Die fragt in der Bedingung immer einmal nach einem Tastendruck.
Dein Code würde wahrscheinlich funktionieren, wenn Du immer eine andere Taste drückst - nicht die Enter-Taste.

Wenn Du dieses Verhalten nicht haben willst, brauchst Du einen zweiten Thread, der die while-Schleife ausführt.
Die Main-Thread teilt dem zweiten Thread dann mit, dass er sich beenden soll.
Ein paar Suchbegriffe dazu: Task, async, await, CancellationToken


Aber ein Tipp wegen deinem Versuch mit Environment.TickCount: Stopwatch
Die Klasse ist eine Stopuhr, die macht genau das, was Du haben willst: Zeit messen

ausblenden C#-Quelltext
1:
2:
3:
4:
var watch = Stopwatch.StartNew();

while (watch.ElapsedMilliseconds < 3000)
    Thread.Sleep(10);

Für diesen Beitrag haben gedankt: SiickneZz
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 11.09.17 09:16 
Hallo und :welcome:

solange keine Taste gedrückt wird, blockiert Console.ReadKey. Mittels der Eigenschaft Console.KeyAvailable kann man aber vorher abfragen, ob eine Taste gedrückt wurde.