PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Tastaturpuffer leeren



jojoomgasd
17.06.2010, 21:43
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"?


bool bShowStats = false;

DWORD __stdcall ThreadInformation(void* p)
{
Console::create Console;
int i = 0;

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

InitConsole();

return 0;
}

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

int main(int argc, char* argv[])
{
Console::create Console;
char* cmd = new char[32];

InitConsole();

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

gets_s(cmd, 32);

if(SAME(cmd, Console::CMDS::stats))
{
bShowStats = true;
CreateThread(0, 0, (LPTHREAD_START_ROUTINE)&ThreadInformation, 0, 0, 0);
}
}
}

Hu5eL
17.06.2010, 22:06
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

jojoomgasd
17.06.2010, 22:14
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

Hu5eL
17.06.2010, 22:17
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

jojoomgasd
17.06.2010, 22:24
Natürlich war ich so frei Google nicht zu benutzen :rolleyes:

Funktioniert nicht

inout
17.06.2010, 22:43
Die C++ Variante um den Eingabepuffer zu bis zum Zeilenende zu überlesen ist für gewöhnlich
cin.ignore(numeric_limits<streamsize>::max(), '\n'); oder
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.

jojoomgasd
19.06.2010, 14:28
Bitte helft mir, es ist sehr wichtig.