2016-12-09 3 views
-1

Ich habe derzeit ein kleines Programm, das ich schreibe, die für ein Stück Code, der x Sekunden warten wird, um zu sehen, ob der Benutzer nichts eingibt und wenn keine Eingabe gegeben wird, wird weiter Code ausgeführt. Solch ein Ding wäre auch in einer for-Schleife enthalten, so dass, sobald der weitere Code ausgeführt worden ist, es die endliche Zeitperiode für die Eingabe erneut wartet. Wenn die Eingabe über einen Tastendruck erfolgt, fährt der Code mit der Ausführung von weiterem, aber abweichendem Code fort. Zunächst habe ich versucht, dies unter Verwendung einer while Schleife, <time.h> 's clock() und scanf() zu lösen, aber ohne Erfolg. Mein letzter Versuch unterscheidet sich etwas, aber immer noch nicht das gewünschte Ergebnis. Mein neuester Code ist wie folgt:C warten auf eine begrenzte Zeit für eine Benutzereingabe, bevor Sie mit dem Skript weitergehen

int c; 
char check[10]; 
    for(c=0;c<1000;++c){ 
     //do something 
      int end=time(0)+(1); 
      while(time(0)<end){ 
       fgets(check,10,stdin); 
       if(*check=='\n'){ 
       break; 
       } 
      } 
     //do the other stuff 
     if(*check!='\n'){ 
      break; 
     } 
    } 
    //even more stuff 

ich alle relevanten Dateien Kopfzeile oben erklärt habe, von meinem Skript, aber jetzt bin ratlos, wie zu verfahren und ich Windows benutze. Jede Hilfe wäre willkommen.

Vielen Dank

+0

Sie sind auf der Suche nach [ 'sleep'] (http://man7.org/linux/man-pages/man3/sleep.3.html)? –

+0

Möchten Sie überprüfen, ob der Benutzer etwas innerhalb eines Zeitintervalls eingegeben hat. – sas

+2

Nein, nicht "schlafen", denn das würde die Ausführung anhalten, was ich fast zu vermeiden versuche, wie 'fgets' und' scanf' das tun unbestimmt. Ich nehme an, ich suche mehr, was @sas erwähnt hat und möchte überprüfen, ob der Benutzer etwas in einem Zeitintervall eingegeben hat und Fortschritt wenn nicht. – dbr

Antwort

0

Nun, in Ihrem Fall, weil Sie auf den Eingang warten, select() oder poll() wird eine gute Wahl sein.

+1

Ich habe Versuche gemacht, etwas darüber zu lesen, aber ich bin nicht ganz sicher, ob ich vollständig verstanden habe, wie ich sie benutze. Würde es dir etwas ausmachen, ein kurzes generisches Beispiel zu schreiben, dass ich versuchen könnte, meinen Kopf herum zu bekommen, bitte? – dbr

3

In Standard C gibt es hierfür keine geeignete Lösung. time.h ist für diese Aufgabe nicht sinnvoll.

Operative Systeme haben verschiedene Nicht-Standard-API-Bibliotheken, die diese Art von Funktionalität bereitstellen, üblicherweise in Form eines Ereignisses, das eine Rückruffunktion auslöst.

Da Sie nicht erwähnen, welches System Sie verwenden, ist es nicht möglich, eine gute Antwort zu geben.


EDIT

Unter Windows können Sie die Windows console API, durch windows.h verwenden. Hier ist ein Beispiel dafür, wie zu überprüfen, ob eine Taste gedrückt wird, ohne dass das Programm in einem busy-wait Perren:

HANDLE hstdin = GetStdHandle(STD_INPUT_HANDLE); 
DWORD fdwMode = ENABLE_WINDOW_INPUT; 
(void)SetConsoleMode(hstdin, fdwMode); 
(void)FlushConsoleInputBuffer(hstdin); 

... 

bool is_key_pressed (void) 
{ 
    if(WaitForSingleObject(hstdin, 0) != WAIT_OBJECT_0) 
    { 
    return false;        // no events flagged 
    } 

    DWORD cNumRead; 
    INPUT_RECORD irInBuf[128]; 

    if (!ReadConsoleInput(hstdin,     // input buffer handle 
         irInBuf,     // buffer to read into 
         128,      // size of read buffer 
         &cNumRead))    // number of records read 
    { 
    return false; 
    } 

    for (DWORD i = 0; i<cNumRead; i++) 
    { 
    if(irInBuf[i].EventType == KEY_EVENT) 
    { 
     return true; 
    } 
    } 

    return false; 
} 
+0

Ich benutze Windows, wenn das hilft. – dbr

+2

@DeanBrunt Sie sollten das mit der Frage eingefügt haben. Die Leute schlagen bereits verschiedene Unix-Lösungen vor ... Nun, was Sie wahrscheinlich wollen, ist die Windows-Konsolen-API. Ich werde den Beitrag bearbeiten. – Lundin

+0

Beachten Sie jedoch, dass ich weit von einem Windows-API-Experten entfernt bin. Wenn du deine Frage "windows" und "winapi" markierst, wirst du die Aufmerksamkeit von solchen Tieren auf sich ziehen. – Lundin

3

Sie haben mit einem Timeout wählen zu verwenden und dann die IO durchzuführen. Ein Ausgangspunkt könnte sein:

#include <sys/select.h> 
#include <stdio.h> 

int main(void) { 
    char buf[100]; 
    fd_set rfds; 
    int r; 

    FD_ZERO(&rfds); 
    FD_SET(0, &rfds); 
    struct timeval timeout; 
    timeout.tv_sec = 3; 
    timeout.tv_usec = 0; 
    r = select(1, &rfds, NULL, NULL, &timeout); 
    if(r == 0) 
     printf("timeout!\n"); 
    else { 
     fgets(buf, 100, stdin); 
     printf("==> %s\n", buf); 
    } 
} 
+0

Ich habe meine ursprüngliche Post, um dies zu reflektieren, aber ich benutze Windows, die nicht unterstützt '' von dem, was ich sehen kann. Ich habe versucht, ein Äquivalent zu verwenden, das an anderer Stelle in "" vorgeschlagen wurde, aber das hat auch nicht funktioniert. – dbr

+0

Aber select() ist Posix-kompatibel ... vielleicht sind die Header-Dateien etwas anders. –

+0

@DeanBrunt "using windows" ist ein Betriebssystem, kein Compiler. Compiler existieren für Windows, die dieser Code gut kompiliert. (habe es gerade getan). Nicht einverstanden mit [@Basile Starynkevitch] (http://stackoverflow.com/questions/41061571/having-c-wait-for-a-finite-amount-of-time-for-a-user-input-before-moving- on-with # comment69331312_41061571). Die Lösung ist nicht OS-spezifisch, sondern compilerspezifisch. – chux

Verwandte Themen