Tastendruck in C# Konsole-Applikation



  • Hallo,

    ich bin ein ziemlicher C# Anfänger und suche nach einer Möglichkeit, Tastendrücke (wie getche() in C o.ä.) in einer C# Konsolen-Anwendung auszuwerten. Ich habe eine Endlosschleife, die ihre Arbeit mit Tastendruck einstellen soll. Ich habe mich schon durch die EventLog-Klasse gearbeitet, werde aber nicht schlau daraus.

    Hat jemand eine Idee?

    Gruß CS



  • Readline?

    Gruß

    Markus Seidl



  • Wenn's so einfach wäre...
    Ich meine es so:

    while(true)
    {
      doImportantThings;
      if (<Keypressed>) break; # den Code für <Keypressed> suche ich
    }
    

    D.h.:
    Die Schleife fragt bei jedem Durchlauf einen Tastendruck ab. Wurde keine Taste gedrückt, macht sie sofort mit dem nächsten Durchlauf weiter.
    ReadLine() unterbricht das Programm, bis irgendwann einmal Enter gedrückt wurde. Und gerade das will ich nicht.

    Gruß CS



  • Naja, da kommste nicht umhin einen eigenen Thread zu basteln. Ist doch eigentlich recht einfach.

    Du kannst doch aus einem anderen Thread heraus ebenfalls in die Konsole schreiben lassen. Du könntest einen Thread starten der irgendetwas abarbeitet, und dabei in die Konsole schreibt. So und diesen Thread packste als Aufruf eine Zeile vor dem Readline. Wenn Readline nun über Enter beendet wird, könntest du weiteren Code ausführen. Vielleicht eine Feldvariable, über den du den Status IM WORKERTHREAD abrufen kannst. Wenn die Abbruchbedingung vorliegt, brichste den Thread einfach ab, indem du dann mit Break die Schleife innerhalb des Threads beendest.

    Das würde dann ungefähr so aussehen.

    static void meinWorkerThread
    {
        while(!abbruch)
        {
             doImportantThings;
        }
    
        if(!abbruch)
        {
             durchgelaufen = true;
             Console.WriteLine("Programm Durchgelaufen");
        }
    }
    
    .
    .
    .
    
    bool abbruch = false;
    bool durchgelaufen = false;
    
    .
    .
    . //Konstruktoren und was du noch so alles brauchst.
    
    //irgendwo in Main
    
        Thread meinThread = new Thread(new ThreadStart(meinWorkerThread));
        meinThread.Start();
        Console.ReadLine();
    
        //der WorkerThread könnte sich in der Console zurückmelden.
        if(!durchgelaufen)
        {
            abbruch = true;
        }
        //setze wieder auf Standardwerte zurück
        abbruch = false;
        durchgelaufen = false;
    .
    .
    . //noch irgendein Code
    }
    

    Das würde mir jetzt so spontan einfallen. Aber vielleicht gibt es noch ein Event das bei einem Tastendruck ausgelöst wird, an welches du eine Funktion dranhängen kannst, welche DANN die Variable "abbruch" verändert. Das kann man bestimmt noch vereinfachen. Bin ja aber noch am Anfang mit C#. Aber vielleicht hilfts, damit du zumindest dein Programm soweit testen kannst. Und wenn du mal ein Event dafür findest, kannst du es ja umbauen.

    Gruß

    Markus Seidl



  • Jep, so läufts. Mein Thread macht nichts weiter als ein ReadLine() und setzt dann ein statisches Flag auf true, welches mein Main() ständig abfragt.

    Danke! CS


Log in to reply