none
[C#] Problem mit der Feststellung ob eine Gewisse Taste gedrückt ist RRS feed

  • Frage

  • Hallo,

    Mein Problem Ich habe mir ein Programm geschrieben, das gewisse Funktionen ändert wenn man eine Taste drückt. Ich habe die Einstellungen in Forms gemacht und zum Starten des Programmes Funktioniert es auch. Jedoch habe ich ein Funktion:

    do{

         System.Threading.Thread.Sleep(100);

          .....   // unterprogramme

    }whiel(Bedingung);

    die, sobald sie beginnt, immer wieder Rechenoperationen durchführen muss (Bei Tasten Klick sollen gewisse Paramter geändert werden). Da liegt jedoch das Problem. Denn ab diesem Punkt kann ich kein keine Taste mehr auswerten geschweige denn das Programm schließen. Ich muss dann immer "Shift + F5" (Stopp Debugging) machen um das Fenster zu schließen oder warten bis die Bedingung erfüllt ist.

    Weis nun jemand wie ich, egal wann, den Tasten druck registrieren/auswerten kann?

    Schon vorab vielen Dank für eure Hilfe.

    Sonntag, 16. Dezember 2012 16:23

Antworten

  • Hallo,

    das ist eigentlich ganz einfach. Solange wie du Dinge berechnest, andere Sachen auswertest oder einfach nur mit Sleep den Thread anhälst, dann wird der GUI Thread blockiert. Die einfachste Lösung ist nun, die Operationen in einen 2. Thread auszulagern. Dazu kannst du Beispielsweise einen BackgroundWorker nehmen.

    Algemein zum Theme Threading in C# kannst du dir folgenden Artikel durchlesen:
    http://msdn.microsoft.com/de-de/library/ms173178%28v=vs.110%29.aspx
    Dort sind dann jede Menge weiterer, hilfreicher Seiten verlinkt.


    Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/

    Sonntag, 16. Dezember 2012 16:31
    Moderator
  • Hi Sausy,

    für mich klingt es jetzt erst mal so als ob du die Funktion nicht in einen Eigenen Thread startest und deshalb die Form hängt bis die Funktion durchgelaufen ist.

    Das kannst du umgehen indem du Sie in einen eigenen Thread startest oder ab Framework 4.5 (wenn ich das richtig im Kopf habe) das Async Schlüsselwort, was jetzt besser zu deinem Problem musst du mal schauen.

    Was die Parameter angeht die kannst du mit einen Objekt an den Thread Übergeben.Was dann der UI Thread und dein Thread für die Funktion kennt.

    Du musst hier nur aufpassen das du nicht "gleichzeitig" aus beiden Threads auf Werte des Objekts zugreifst, weil dass zu Fehlern führen kann.

    In C# gibt es dazu z.b. das Volatile Attribut, man kann auch ein lock benutzen.

    Grundlegend sollte man sich aber beim Multithreating mal in ruhe einlesen, da es mehrer Fehlerquellen gibt. Hier mal ein Tutorial von Microsoft dazu.

    MFG

    Björn

    Sonntag, 16. Dezember 2012 16:50

Alle Antworten

  • Hallo,

    das ist eigentlich ganz einfach. Solange wie du Dinge berechnest, andere Sachen auswertest oder einfach nur mit Sleep den Thread anhälst, dann wird der GUI Thread blockiert. Die einfachste Lösung ist nun, die Operationen in einen 2. Thread auszulagern. Dazu kannst du Beispielsweise einen BackgroundWorker nehmen.

    Algemein zum Theme Threading in C# kannst du dir folgenden Artikel durchlesen:
    http://msdn.microsoft.com/de-de/library/ms173178%28v=vs.110%29.aspx
    Dort sind dann jede Menge weiterer, hilfreicher Seiten verlinkt.


    Koopakiller [kuːpakɪllɐ] http://koopakiller.ko.ohost.de/

    Sonntag, 16. Dezember 2012 16:31
    Moderator
  • Hi Sausy,

    für mich klingt es jetzt erst mal so als ob du die Funktion nicht in einen Eigenen Thread startest und deshalb die Form hängt bis die Funktion durchgelaufen ist.

    Das kannst du umgehen indem du Sie in einen eigenen Thread startest oder ab Framework 4.5 (wenn ich das richtig im Kopf habe) das Async Schlüsselwort, was jetzt besser zu deinem Problem musst du mal schauen.

    Was die Parameter angeht die kannst du mit einen Objekt an den Thread Übergeben.Was dann der UI Thread und dein Thread für die Funktion kennt.

    Du musst hier nur aufpassen das du nicht "gleichzeitig" aus beiden Threads auf Werte des Objekts zugreifst, weil dass zu Fehlern führen kann.

    In C# gibt es dazu z.b. das Volatile Attribut, man kann auch ein lock benutzen.

    Grundlegend sollte man sich aber beim Multithreating mal in ruhe einlesen, da es mehrer Fehlerquellen gibt. Hier mal ein Tutorial von Microsoft dazu.

    MFG

    Björn

    Sonntag, 16. Dezember 2012 16:50
  • Vielen Dank für euer Anworten ich könnte das Problem Lösen. Hat Super Geklappt thx.
    Sonntag, 16. Dezember 2012 18:04