Ergebnis 1 bis 7 von 7
  1. #1
    DateMake Dialer Avatar von jojoomgasd
    Registriert seit
    17.05.2010
    Beiträge
    100

    Standard [C++] Tastaturpuffer leeren

    So mein Programm liest in einer unendlichen Schleife einen String ein und wenn dieser "stats" entspricht startet er einen Thread.

    Während der Thread läuft, ist die obrige Schleife gestoppt. Wenn man während der Thread läuft etwas eingibt passiert nichts. Doch sobald der Thread endet startet die Schleife wieder richtig und liest einen String ein. Jetzt erscheint in der Zeile von der Konsole das, was man eingegeben hatte während der Thread lief. Kann man das unterbinden oder "löschen"?

    PHP-Code:
    bool bShowStats false;

    DWORD __stdcall ThreadInformation(voidp)
    {
        
    Console::create Console;
        
    int i 0;

        while(
    bShowStats)
        {
            
    i++;
            if(
    == 50)
            {
                
    bShowStats false;
                break;
            }
            
    Sleep(100);
        }

        
    InitConsole();

        return 
    0;
    }

    void InitConsole()
    {
        
    Console::create Console;
        
    Console.cls();
        
    Console << "Test" << Console::endl;
    }

    int main(int argccharargv[])
    {
        
    Console::create Console;
        
    charcmd = new char[32];

        
    InitConsole();

        for(;;)
        {
            if(
    bShowStats)
            {
                
    Sleep(100);
                continue;
            }

            
    gets_s(cmd32);

            if(
    SAME(cmdConsole::CMDS::stats))
            {
                
    bShowStats true;
                
    CreateThread(00, (LPTHREAD_START_ROUTINE)&ThreadInformation000);
            }
        }


  2. #2
    Capt'n Crunch
    Registriert seit
    10.07.2008
    Beiträge
    999

    Standard

    zuerst: noch nie c++ gemacht, kenn nur bissl c und java...
    wenn man ein wenig doku zu gets_s ließt, steht da sowas wie:
    ließt eine zeile ein und speichert diese in einem char* mit dem newline '\n'.

    ok. da sind noch einige fehler:
    was ist wenn der user mehr als 32 zeichen eingibt?

    du solltest nach jedem gets_s den erhaltenen string nach dem \n durchsuchen, falls nicht vorhanden solange gets_s machen, bis das \n kommt...

    und du könntest einfach bevor du die "richtige" eingabe erwartest (wenn der thread beendet wurde) löscht du einfach vorher den eingabebuffer, also gets_s bis \n gefunden wird und dann erst kommt die erwartete eingabe.

    soweit erstmal, ist schon spät, hoffe man versteht es ein wenig
    bitcoin. Banking Is Necessary. Banks Are Not. - by Lincoln6Echo

    Das ganze Mysql usw is mir zu viel arbeit um es zu lernen

  3. #3
    DateMake Dialer Avatar von jojoomgasd
    Registriert seit
    17.05.2010
    Beiträge
    100

    Standard

    Ich habe deswegen ja gets_s() benutzt (Wegen Bufferoverflow's) aber es geht ja um etwas anderem. Wenn der Thread läuft kann ich nichts eingeben, aber das was ich eingegeben habe erscheint wenn der Thread zuende ist. Wie bei der Eingabeaufforderung falls man was eingibt, aber noch nicht Enter gedrückt hat...

    Das Versuche ich zu löschen damit man einfach weiter machen kann

  4. #4
    Capt'n Crunch
    Registriert seit
    10.07.2008
    Beiträge
    999

    Standard

    1 min google:
    huhu...

    also ich weiss nciht genau wie und ob das in Ansi-C geht, aber versuch es mal mit:

    fflush(stdin);
    getchar();

    damit wird normalerweise der eingabebuffer gelöscht.. kannst es ja mal testen und sagen ob es gefunzt hat

    winke winke

    tommy
    bitcoin. Banking Is Necessary. Banks Are Not. - by Lincoln6Echo

    Das ganze Mysql usw is mir zu viel arbeit um es zu lernen

  5. #5
    DateMake Dialer Avatar von jojoomgasd
    Registriert seit
    17.05.2010
    Beiträge
    100

    Standard

    [ironie]Natürlich war ich so frei Google nicht zu benutzen [/ironie]

    Funktioniert nicht

  6. #6

    Registriert seit
    17.06.2009
    Beiträge
    559

    Standard

    Die C++ Variante um den Eingabepuffer zu bis zum Zeilenende zu überlesen ist für gewöhnlich
    Code:
    cin.ignore(numeric_limits<streamsize>::max(), '\n');
    oder
    Code:
    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    Ob das bei stdin sinnvoll ist bzw. ob dir das dir bei deinem Problem hilft, weiss ich nicht.
    Wieso benutzt du denn keine (string)streams bzw. getline() zum Lesen?

    Und btw.: Das ständige Abfragen einer globalen/statischen Variable um auf einen Thread zu warten (Polling), ist zwar naheliegend, aber nicht so ganz sauber.
    Guck' dir dazu evtl. mal sowas wie WaitForSingleObject() o.Ä. an.
    Geändert von inout (17.06.2010 um 22:46 Uhr)

  7. #7
    DateMake Dialer Avatar von jojoomgasd
    Registriert seit
    17.05.2010
    Beiträge
    100

    Standard

    Bitte helft mir, es ist sehr wichtig.

Stichworte

Berechtigungen

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