WAIT in der Consule, Abbruch nach Zeit und Keypress

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von Kangaroo.

    WAIT in der Consule, Abbruch nach Zeit und Keypress

    Hallo!

    Kann ich mit VB2010 eine Consolenanwendung erstellen, die
    - eine vorgegebene Zeit wartet und dann "0" als Rückgabewert liefert
    - nach drücken einer Taste sofort abbricht und das eingegebene Zeichen zurück liefert

    Ich habe noch keinen Mechanismus gefunden, der auf beide Ereignisse triggert.
    Jedes für sich und auch die Rückgabe sollte kein Problem sein.

    Manfred von Richthofen
    Thread, der einen Timer simuliert und dann eine boolsche Variable umlegt, die in Zusammenhang mit einer Tastenabfrage wie GetChar() (geht das ?) eine Endlos-Schleife kreieren.
    Warum einen extra Thread ? Es gibt bestimmt unzählige Möglichkeiten dies zu lösen, wenn man eine Methode benutzt die den Input-Stream testet ohne zu blocken ( wie Read, ReadKey, Readline).

    Zum Beispiel kannst Du die Property Console.KeyAvailable benutzen, um abzufragen ob eine Taste gedrückt wurde, mittels Console.ReadKey kannst Du diese dann abrufen.

    Zusammen mit einer While Schleife für die Zeitspanne solltest Du Dir Deine Lösung basteln können.
    @Kangaroo: Der Thread zum Timen. Hätte ich gemacht (gehen Timer in Konsolenanwendungen ?) oder die Laufzeit in Millisekunden benutzt zur Berechnung.

    Mangafreak1995 schrieb:

    gehen Timer in Konsolenanwendungen ?

    Welche Klasse Timer meinst Du denn ? Die Forms.Timer wären eher sinnlos, System.Timer bzw. System.Threading.Timer gehen selbstverstänlich auch in der Console. Allerdings sind das ziemlich aufwändige Systemressourcen, so dass ich eher auf eine simple Funktion zurückgreifen würde:

    Quellcode

    1. Sub Main()
    2. MsgBox("done: " & WaitForKeyOrTimeout(5))
    3. End Sub
    4. Function WaitForKeyOrTimeout(ByVal seconds As Integer, Optional ByVal defaultKey As Char = "0"c) As Char
    5. Dim tOut As DateTime = DateTime.Now.AddSeconds(seconds)
    6. While DateTime.Now < tOut
    7. If Console.KeyAvailable Then Return Console.ReadKey.KeyChar
    8. ' reduce cpu load
    9. System.Threading.Thread.Sleep(100)
    10. End While
    11. Return defaultKey
    12. End Function