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: 1200
Erhaltene Danke: 158

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
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: 4037
Erhaltene Danke: 834

Win7
C++, C# (VS 2015/17)
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.