C++ Eingabemöglichkeit zeitlich begrenzen

...komplette Frage anzeigen

2 Antworten

Das ist ein interessantes Problem, eine möglichkeit wie du das erreichen könntest wäre einen neuen thread zu erstellen in dem du die Eingabe abfrägst, während du den Hauptthread 3 Sekunden warten lässt und er dann den 2. Thread abschießt falls er noch nicht beendet ist.

Hol dir die Systemzeit, schreib die sekunden in nen int_alt und mach dann sowas wie.

int_neu=systemzeit.sekunden;

int_alt=sytemzeit.sekunden;

while | Int_neu - int_alt 3  && Eingabe nicht getätigt| 

    |   

   Fehlermeldung;

  | 

 

|

 

GF hat iwie probs mit geschweiften klammern Oo

puecklerice 11.05.2011, 12:46

Ach son Dreck, jetzt fehlt da die Hälfte. Was ist denn das für ein Mist?

Zusammenfassend: Biete die Eingabe einfach so lange an, wie die Bedingung erfüllt ist ( in der while.-schleife).

0
marting83 11.05.2011, 12:57

Das Problem ist ja gerade dass eine Eingabeaufforderung mit cin erst dann zurückkommt und der code weiter ausgeführt wird wenn der Benutzer eine Eingabe macht. Das ganze in eine while-Schleife zu packen bringt da rein gar nichts.

0
gfuser9283 11.05.2011, 13:02
@marting83

Doch das bringt was und so wird es auch bei Spielen gemacht. Nennt sich Hauptschleife oder Spielschleife. Aber da eine Antwort bereits ausgezeichnet ist, habe ich keine Lust weiter zu erklären ^^

0
marting83 11.05.2011, 13:35
@puecklerice

Also rein interesse halber würde mich das schon interessieren wie ihr das Problem lösen würdet. Ich bin studierter Informatiker und ich sehe keine Möglichkeit das Problem mit einer einfachen while-Schleife zu lösen, wenn du innerhalb der Schleife einen blockierenden "cin" aufruf hast. Ich lasse mich aber gerne eines besseren belehren...

0
Sovebamse 15.03.2012, 22:24
@marting83

Hallo, hab diesen Thread auch gefunden, weil ich ein Matheübungsprogramm schreiben wollte. Ich hatte auch das Problem, dass eine Eingabe nur eine bestimmte Zeit möglich sein soll.

Ich habe das Ganze mit "getche()" gelöst und einzelne Zeichen in einer for-Schleife in ein Array eingelesen, welches nachher nach int umgewandelt wird. Dabei kann man sogar die Backspace-Taste verwenden, geht wunderbar.

Um die Zeit ablaufen zu lassen, habe ich die Systemzeit time(NULL) in eine Variable eingelesen. Zwei do-while-Schleifen (eine für den ersten Tastendruck (wird per kbhit() überprüft) und dann innerhalb der for-Schleife (also nach jeder Eingabe)noch einmal, laufen so lange, bis die aktuelle Zeit time(NULL) minus die Zeit bei Beginn der ersten do-while-Schleife kleiner 5 (Sekunden) ist. Den Eingabeteil per getche() habe ich im Internet gefunden (Prog zur Passwortabfrage) und dann leicht modifiziert.

Hier der Code des ganzen Programms (sorry, wegen den Kommentaren und den Codezeilen, die keinen Platz haben):

#include <iostream>
#include <conio.h>
#include <ctime>
#include <windows.h>
#include <wincon.h> 

using namespace std;

void CursorVerschlucker(int Wert) //Cursor ausblenden
{ 
 CONSOLE_CURSOR_INFO info; 
 HANDLE  out; 
 info.bVisible = Wert; 
 info.dwSize = 1; 
 out = GetStdHandle(STD_OUTPUT_HANDLE); 
 SetConsoleCursorInfo( out,  &info ); 
} 

int einstelligZufall()
{
 int zahl;
 srand( (unsigned)time( NULL ) );
 zahl = rand() % 10;
 return zahl;
}

int zweistelligZufall()
{
 int zahl2;
 srand( (unsigned)time( NULL ) );
 zahl2 = rand() % 99;
 return zahl2;
}

int main()
{
int i, max=100; //Hilfszahl für Schleife
int Zahl1; //erste Zufallszahl der Rechnung
int Zahl2; //zweite "
int Resultatcomp; //vom Computer ausgerechnetes Resultat
int Anzahl; //wie viele Rechnungen
int anz; //Hilfszahl für Schleife
int Eingabe[100]; //Array für nach int umgerechnete chars

CursorVerschlucker(0);

system("CLS");
cout << "Wie viele Rechnungen willst du \x81 \bben? ";
cin >> Anzahl;
system("CLS");

for (anz = Anzahl; anz > 0; --anz)
{
 if (anz != Anzahl)
 {
  Sleep (3000);
  system("CLS");
 }

char text[10]={'x'}, z; //setzt alle Arraywerte auf 'x'
                       //zur Überprüfung, ob überhaupt etwas eingegeben wurde

Zahl1 = einstelligZufall();
Zahl2 = zweistelligZufall();
Resultatcomp = Zahl1 + Zahl2;  
time_t t0 = time(NULL); //setzt vergangene Sekunden seit 1970 oder so

cout << "Rechne: " << Zahl1 << " + " << Zahl2 << ": ";

do
{
 if(kbhit()) //wartet auf Tastendruck
 {
  for(i=0;i<max;) //liest Zeichen ein bis max
  { 
   do
   {
    if(kbhit())
    {
     z = getch(); 

     switch(z) //wurde was Spezielles gedrückt? 
     { 
      case 0: //Sondertasten wie z. B. Pfeil nach oben 
              if(kbhit()) //bei Sondertasten werden zwei Werte eingelesen! 
              getch(); //Wert der Sondertaste lesen 
              break; 

      case 8: //Rücktaste (Zeichen links vom Cursor löschen) 
              if(i>0) 
              { 
               printf("\x8 \x8"); //Zeichen am Bildschirm löschen 
               text[i-1] = 0; //letztes Zeichen löschen 
               --i; 
              } 
              break; 

      case 13: // Enter
               if(i == 0) //wenn erster Wert Enter, Schleife nicht verlassen
               {
                break;
               }
               else
               {
                goto Enter; //wenn anderer Wert Enter, Schleife verlassen
                           //damit auch die Wartedauer von while unterdrücken
               }

      default: //restliche Zeichen 
               if(z>=' ') //keine Steuerzeichen! 
               { 
                printf("%c", z); //Zeichen ausgeben; wenn pwz 0 dann eingegebenes Zeichen 
                text[i++] = z; 
               }
               break; 
      } 
     }
   } 
  while(time(NULL)-t0 < 5); //wartet max. 5 Sekunden
  break;
  }
 }
}

while(time(NULL)-t0 < 5);

Enter: //Sprungmarke, falls mit Enter die Wartedauer unterbunden wird

if(text[0] == 'x' || text[0] == 13) //prüft, ob Eingabe erfolgt ist
                                   //oder ob das erste Zeichen ein Enter war
{ 
 cout << Resultatcomp; 
}

else
{
 Eingabe[0] = atoi(&text[0]); //wandelt das Array nach int um

 if(Eingabe[0] == Resultatcomp) //vergleicht Eingabe mit Computerresultat
 {
  cout << endl << endl << "Richtig!";
 }
 else
 {
  cout << endl << endl << "Falsch! Richtige L\x94sung: " << Resultatcomp;
 }
}
} //Ende for-Schleife

Sleep(2000);
 cout << endl << endl << "Du bist fertig mit \x9A \bben. Programm wird beendet.";
 Sleep(3000);
 system("CLS");

return 0;
}

Gruss Thomas

0

Was möchtest Du wissen?