-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: Tastaturabfrage in C++

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    321

    Tastaturabfrage in C++

    Anzeige

    Mahlzeit!

    Jetzt mal was wahrscheinlich banales!

    Das Problem hatte ich bislang nicht, da ich normalerweise wenn dann eher mit GUIs arbeite und es da "von selbst" funktioniert und die Arduinos machen das ja auch von Hause aus.

    Ich möchte das meine Anwendung im Terminal läuft, also keine GUI verwendet. Das ist soweit auch kein Problem. Jedoch soll das Programm durchgehend laufen. Genau wie beim Arduino die loop() Schleife. Das Programm soll also in dieser Schleife vor sich hin laufen und eventuell, je nachdem was das Programm mal an "Reizen" bekommt, auch auf diese reagieren können. Es soll aber auch reagieren wenn ich etwas eingebe.

    Wie realisiere ich das, ohne das die gedrückte Taste dann auch dumm in den Terminal geschrieben wird?

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Hallo,

    so ganz banal ist das nicht. Ich denke die Standard C++ Eingabemittel wie cin oder getline() sind schon so gemacht, dass man auch sieht, was man schreibt. Das ist mir in den meisten Fällen auch recht so. Dinge die durchgehenend laufen, packt man normalerweise in einen std::thread, das Hauptprogramm kann dann ruhig blockierend z.B. in einem getline stecken und auf Eingabe waren.

    Tastaturabfrage ohne dass das Zeichen erscheint, geht wahrscheinlich nur betriebssystemabhängig. Eventuell bieten auch Bibliotheken wie Open Frameworks solche Anwendungsarten, da kenne ich mich aber nicht aus.

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo,
    Zitat Zitat von hirnfrei Beitrag anzeigen
    Wie realisiere ich das, ohne das die gedrückte Taste dann auch dumm in den Terminal geschrieben wird?
    Mit kbhit() kannst du abfragen ob ein Zeichen eingegeben worden ist. Dann kannst du dieses Zeichen z.B. mit getch() einlesen.

    getch() wartet bis ein Zeichen vorhanden ist und liefert es dann zurück.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  4. #4
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Ich war nicht wirklich sicher, ob es sich um Linux handelt. Unter Windows sind die als veraltet markiert (nicht Unicode fähig).

    https://msdn.microsoft.com/de-de/library/ms235446.aspx

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.451
    für welche Programmierplattform?
    auf Windows-Plattformen gibt es (normalerweise ?) für kbhit() und getch() <conio.h>, das gibt es aber nicht auf Linux-Systemen. (Für Linux (Raspbian/Debian) benutze ich einen selbstgestrickten Ersatz, der halbwegs genauso funktioniert - wenn dich das interessiert...? )
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von i_make_it
    Registriert seit
    29.07.2008
    Ort
    Raum DA
    Alter
    49
    Beiträge
    2.444
    Zuerst sollte das OS und der C++ Dialekt bekannt sein um da was sagen zu können.
    Wenn man ganz in die Hardware rein geht liest man den Tastaturpuffer direkt aus.
    Etwas weiter oben ist das auslesen der Tastatur Scancodes mit den Keystroke Messages.
    Bei Windows wäre das WM_KEYDOWN aus der Win32.dll.
    Man greift also direkt auf Betriebssystemfunktionen zu und nutzt keine darauf aufbauenden Befehle der Programmiersprache.
    Wenn man sich damit näher befassen will, sollte man sich Infos zur API Programmierung des jeweiligen OS ansehen.

    Für Linux schau mal hier:
    http://forums.codeguru.com/showthrea...d-control-keys

    Für Windows:
    https://msdn.microsoft.com/de-de/lib...=vs.85%29.aspx

    Scancodes:
    https://msdn.microsoft.com/en-us/lib...=vs.60%29.aspx

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    09.10.2014
    Beiträge
    2.451
    den Code-Guru Code habe ich auf Raspbian Jessie probiert, funktioniert aber nicht.
    Meiner aber schon.
    Aber, wie du ganz richtig schriebst, lass erst den TO mal antworten, welches OS er benutzt.
    Ohne ihn dann doch vorher wieder mit Links zu überschütten.
    ·±≠≡≈³αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmäher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Zitat Zitat von i_make_it Beitrag anzeigen
    Zuerst sollte das OS und der C++ Dialekt bekannt sein um da was sagen zu können.
    Ja, deswegen bin ich da auch vorsichtig.

    Zitat Zitat von i_make_it Beitrag anzeigen
    Oh oh, vorsicht. Nicht einfach nur suchen und verlinken.

    Eine WM_.... ist eine Window Message.
    Posted to the window with the keyboard focus ...
    das geht nur in GUI-Anwendungen mit einer Messageloop. Er hat aber ein Konsolenfenster (wenn er auf Windows ist).

    Ein anderes Problem unter Windows wäre, getch (bzw. _getch) liefern ein char, der Standardzeichentyp bei (halbwegs) aktuellen Windows Entwicklungsumgebungen ist aber wchar_t (UTF-16), das kann dann Probleme bei der Weiterverarbeitung machen.
    Geändert von Mxt (23.01.2016 um 11:16 Uhr)

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    19.01.2016
    Ort
    Saarbrücken
    Beiträge
    321
    Ich bin manchmal echt dämlich!

    Ich arbeite derzeit auf 64 Bit Gentoo Linux. Laufen soll das letzten Endes aber auf einem Raspi.

    Sind ja schon interessante Ideen dabei. Das mit Threat klingt interessant.

    Danke schonmal.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    04.09.2011
    Ort
    Hessen
    Beiträge
    599
    Zitat Zitat von hirnfrei Beitrag anzeigen
    Das mit Threat klingt interessant.
    Ich hab mal auf die schnelle was zusammengeschrieben, ist jetzt aber mit Visual Studio 2015:
    Code:
    // WorkerThread.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    
    std::mutex g_mutex;
    
    void console_out(const std::string& text)
    {
        std::lock_guard<std::mutex> lock(g_mutex);
    
        std::cout << text << std::endl;
    }
    
    class Worker
    {
    private:
        bool m_Run;
        int m_Counter;
    
    public:
    
        Worker() : m_Run(true), m_Counter(0)
        {}
    
        void Stop()
        {
            m_Run = false;
        }
    
        void Reset()
        {
            m_Counter = 0;
        }
    
        void operator()()
        {
            while (m_Run)   // Hier ist die "Loop" !
            {
                 console_out(std::to_string(m_Counter++));
    
                 std::this_thread::sleep_for(std::chrono::milliseconds(1000));
            }
        }
    };
    
    int main()
    {
        Worker worker;
    
        std::thread t(std::ref(worker));
    
        for (;;)
        {
            std::string input;
            std::getline(std::cin, input);
    
            if (input == "exit")
            {
                worker.Stop();
                break;
            }
            else if (input == "reset")
            {
                worker.Reset();
            }
            else
            {
                console_out("unknown command");
            }
        }
    
        if (t.joinable())
        {
            t.join();
        }
    
        return 0;
    }
    mit

    Code:
    // stdafx.h: Includedatei für Standardsystem-Includedateien
    // oder häufig verwendete projektspezifische Includedateien,
    // die nur in unregelmäßigen Abständen geändert werden.
    //
    
    #pragma once
    
    #include "targetver.h"
    
    #include <tchar.h>
    
    // TODO: Hier auf zusätzliche Header, die das Programm erfordert, verweisen.
    #include <string>
    #include <mutex>
    #include <thread>
    #include <iostream>
    Geändert von Mxt (23.01.2016 um 13:03 Uhr) Grund: Kommentar zur Loop eingebaut

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Tastaturabfrage innerhalb der Interrupt Service Routine
    Von Sven2013 im Forum Arduino -Plattform
    Antworten: 2
    Letzter Beitrag: 16.03.2013, 20:51
  2. Tastaturabfrage
    Von jibyz im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 16.06.2006, 12:33
  3. RN-Control 1.4 Mega32 & RN-KeyLCD Tastaturabfrage RS232
    Von brundle im Forum Schaltungen und Boards der Projektseite Mikrocontroller-Elektronik.de
    Antworten: 2
    Letzter Beitrag: 14.09.2005, 14:27
  4. AVR-MT von Olimex Tastaturabfrage (3x3 Matrix)
    Von Rage_Empire im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 06.04.2005, 19:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •