Zeit-Befehl ?



  • Uey 🙂
    ich hab mal ne frage ...
    ich brauche eine funktion mit der ich abfragen in der art

    "WENN eine sekunde vergangen UND getch()=NULL mach blabla"
    "WENN eine sekunde vergangen UND getch()=blubb mach blubb"
    

    gestalten kann ...

    könntet ihr mir helfen ?



  • PhoenixN schrieb:

    Uey 🙂
    ich hab mal ne frage ...

    Lol, ich weiß auch nie wie ich meine Fragen einleiten soll 😃

    WENN-Bedingungen gehen ja bekannterweise mit der if-Klausel.
    Das logische UND drückt man mit dem &&-Operator aus.

    Was wars noch? Ahja, die eine Sekunde... Dazu musst du erstmal wissen, wann die eine Sekunde anfangen soll. Dazu kannst du GetTickCount, timeGetTime, time oder sonstwas benutzen. Dann prüfst du mit einem erneuten Aufruf, ob eine Sekunde vergangen ist. Das kannst du ja auch gleich mit der UND-Abfrage verbinden.

    Wie die Funktion konkret aussehen soll, kann ich dir im Moment auch nicht sagen, das Problem dabei ist wohl, dass getch blockt (AFAIK).

    Edit: Was man bräuchte, wär eine Funktion, die prüft, ob eine Taste gedrückt wurde oder nur eine entsprechende Zeit darauf wartet. Oder eine nichtblockierende getch-Version, die immer sofort zurückkehrt und z.B. 0 für "es wurde keine Taste gedrückt" zurückgibt. Hab ich toll weitergeholfen, he? :xmas1:



  • ja das mit if und so ist mir schon bekannt ^^ dachte nur ohne syntax würde klarer was ich versuche zu machen ...
    und getch() unterbricht das prog ... weis ich auch ...
    aber hab vor n spiel zu proggn un da is cin o.ä. unangebracht wegen echtzeit
    gibts das vll noch was besseres als getch() ?



  • PhoenixN schrieb:

    aber hab vor n spiel zu proggn un da is cin o.ä. unangebracht wegen echtzeit
    gibts das vll noch was besseres als getch() ?

    Definitiv, ja. Wenn das Spiel in einem Fenster läuft, kannst du ja die Windows-Nachrichten abfangen. Ansonsten, aber evtl etwas übertrieben (je nach Spiel) DirectInput. Achso, und ein Keyboard-Hook ist natürlich auch schnell implementiert: 🙂
    Meine Empfehlung für Fenster: Windows-Nachrichten
    Meine Empfehlung für Console: Keyboard-Hook (siehe SetWindowsHookEx)

    Edit: Es heißt natürlich DirectInput und nicht DirektInput... Naja, man könnte zur Abwechslung auch mal englische Ausdrücke eindeutschen 😃



  • Badestrand schrieb:

    Meine Empfehlung für Console: Keyboard-Hook (siehe SetWindowsHookEx)

    jetzt mal ne ganz dumme frage...

    was zum henker ist n Keyboard-Hook ??? 😕



  • okay ... mir wurde grade gesteckt das ich das prog mit sleep(1000) ne sekunde warten lassen kann und mit kbhit() kann ich auf knopfdruck warten OHNE das programm zu unterbrechen ...
    aber wie sähe das im queltext aus ?

    hat jm ne idee oder kann mit den funktionen was anfangen ?



  • Ist eigentlich ganz einfach: Du sagst dem Betriebssystem, dass es alle Ereignisse einer bestimmten Art (z.B. Mausbewegungen/Klicks, Tastendrücke, etc) an dein Programm weiterleiten soll.
    So kann ein Programm laufen und (fast) alle Aktionen mitbekommen, die der User macht. Ein Keyboard-Hook überwacht halt alle Tastatureingaben, egal ob dein Fenster den Fokus hat oder nicht.
    Ich weiß leider nur, wie es in Windows geht und hab es noch nie in Konsolenanwendungen gemacht, da sollte es aber genauso funktionieren.
    Du musst entscheiden, ob du den Hook (also die Meldung der Ereignisse) Systemweit oder Threadweit anbringen willst. Threadweit ist erstmal einfacher und dein Programm bekommt alle Tastendrücke mit, die in deinem (Konsolen-)Fenster geschehen.
    Unter Windows spezifierst du eine HookProc-Funktion, die von Windows bei Tastatur-Ereignissen aufgerufen wird. Du meldest den Hook mittels SetWindowsHookEx bei Windows an und entfernst ihn am Ende wieder mit UnhookWindowsHookEx.

    Edit: Keylogger oder Maus-Kilometer-Zähler verwenden IMO auch Hooks 🤡



  • PhoenixN schrieb:

    okay ... mir wurde grade gesteckt das ich das prog mit sleep(1000) ne sekunde warten lassen kann und mit kbhit() kann ich auf knopfdruck warten OHNE das programm zu unterbrechen ...
    aber wie sähe das im queltext aus ?

    hat jm ne idee oder kann mit den funktionen was anfangen ?

    void sepp()
    {
        printf("Dingdong...\n");
        Sleep(1000);
        if(kbhit())
        {
            int ch = getch();
            printf("Blah.\n");
        }
        else
        {
            printf("Blubb.\n");
        }
    }
    

    Oder

    void sepp()
    {
        printf("Dingdong...\n");
        DWORD t0 = GetTickCount();
        while(((GetTickCount() - t0) <= 1000) && (!kbhit()))
            Sleep(10);
    
        if(kbhit())
        {
            int ch = getch();
            printf("Blah.\n");
        }
        else
        {
            printf("Blubb.\n");
        }
    }
    

    Ist dann aber alles schon recht Windows spezifisch...
    p.S.: kann sein dass du statt kbhit() _kbhit() schreiben musst.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum DOS und Win32-Konsole verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Log in to reply