1

C# Befehl für eine bestimmte Zeit Sperren

Frage von DarkIrata DarkIrata

Hey, ich arbeite derzeit an nem kleinen Projekt. Das Problem dabei ist, ich möchte einen Befehler per Tastendruck Steuern, das funktioniert auch soweit sehr Gut. Jedoch wird der Befehler ununterbrochen ausgeführt sollange ich die Taste drücke. Ich möchte aber das nach dem drücken der Befehl für 5 sekunden z.B. gesperrt ist. Mit System.Threating.Thread.Sleep() sperrt er mir das ganze Projekt. mfg.

Fragen zu gleichen Themen finden

Antworten (1)

  • 1
    Antwort von Mickeyman Mickeyman

    Wo wird denn das Event für die Taste geworfen? Denn wenn du es in der Form abfängst, gibt es auch Events, bei denen du nur auf das Runterdrücken oder Loslassen einer Taste reagierst.

    Kommentar von DarkIrata DarkIrataDarkIrata
    Keys[] pressedKeys = Main.keyState.GetPressedKeys();
        for (int j = 0; j < pressedKeys.Length; j++)
        {
         string a = string.Concat(pressedKeys[j]);
         if (a == "O")
         {
         keymode.healbt(); //Dort ist nur der Befehl
         }
        }
    

    Das wäre der Code der das ganze Steuert.

    Kommentar von Mickeyman MickeymanMickeyman

    Was ist denn Main bei dir für ein Objekt oder Klasse?

    Zudem ist das eine Konsolenanwendung oder eine Forms-Anwendung? (Oder was anderes)

    Bei einer Forms-Anwendung würdest du das holen der gedrückten Tasten über die bereitgestellten Events machen. Bei einer Konsole würdest du die Tasteneingaben bei Bedarf aus dem Eingabestrom holen und dadurch löschen.

    Was du vielleicht prinzipiell machen könntest ist, dass du einen System.Threading.Timer verwendest und damit prüfst, ob die Zeit schon abgelaufen ist. Als Ansatz könnte das vielleicht helfen:

            System.DateTime lastPress = System.DateTime.Now;
    
            if (System.DateTime.Now.Subtract(lastPress).TotalSeconds > 5)
            {
                lastPress = System.DateTime.Now;
                // Und nun viel Spaß bei der Arbeit...
            }
    
    Kommentar von DarkIrata DarkIrataDarkIrata

    Konsolenanwendung.. Und in einer Klasse.

    Hmm, bin noch recht neu bei C# ^^, musst mir das wegen Threading.Timer genauer erklären. Bei deinem Code den du mir da geschickt hast, ist das Problem das der Befehl erst nach einer Bestimmten zeit genutzt wird. Ich möchte ihn aber NACH dem nutzen für 5 Sekunden sperren und automatisch auch wieder Freigeben.

    Kommentar von Mickeyman MickeymanMickeyman

    System.DateTime ist eine Struktur, um einen Zeitpunkt abzuspeichern. System.DateTime.Now gibt die momentane Zeit an. Ich glaube das sind ungefähr 60 Millisekunden Genauigkeit.

    Damit es für deinen Fall funktioniert, musst du zunächst den Zeitpunkt des letzten Drückens(lastPress) irgendwo außerhalb der Methode initialisieren. Z.B. mit der momentan Zeit. Der restliche Teil meines Codebeispiels(der if-Teil) muss dann bei dir an die Stelle, wo du derzeit "keymode.healbt();" steht. Und da wo mein Kommentar steht, dein auszuführender Code.

    Damit wird dann geprüft, ob die jeweilige Taste momentan gedrückt ist, wenn ja, dann wird geprüft, ob die vergangene Zeit seit dem letzten drücken der Taste(bzw. beim ersten mal seit dem Starten des Programms) größer ist als 5 Sekunden. Wenn ja, dann wird der Zeitpunkt des letzten Drückens der Taste auf die momentane Zeit gesetzt.

    Falls du noch Fragen hast, stehe ich gerne für eine Antwort bereit. :)

    Kommentar von DarkIrata DarkIrataDarkIrata

    SUPER!!! Funktioniert 1A jetzt wo ich es raus hab! Ich schreibe dich auf jeden Fall in die Credits! Danke, hätte echt nicht gedacht das es SO einfach sein könnte. Nur noch eine Frage. Für die Sekunden, kann man da auch Kommastellen nutzen? Oder muss ich dann auf Millisekunden runtergehen?

    Kommentar von Mickeyman MickeymanMickeyman

    Das freut mich. :)

    Bevor ich hier gleich einschlafe noch: Ja, das Attribut TotalSeconds ist vom Datentyp double und kannst du daher problemlos mit "Kommazahlen" vergleichen. Steht übrigens auch in der Beschreibung des Attributs.

    So, dann noch eine gute Nacht. :D

Diese Frage

Verwandte Fragen

Noch nicht den richtigen Rat gefunden?

Einfach und schnell viele hilfreiche Ratschläge von Deutschlands aktivster Ratgeber-Community erhalten!

Einfach und schnell einen Tipp erstellen und Ihren guten Rat mit anderen teilen!

Einfach und schnell ein Video hochladen und anschaulichen Rat an alle geben!

Die unter gutefrage.net angebotenen Dienste und Ratgeber Inhalte werden nicht geprüft. Die Richtigkeit der Inhalte wird nicht gewährleistet. Rechtliche Hinweise finden Sie hier.