2016-12-09 1 views
-1

У меня в настоящее время есть небольшая программа, которую я пишу, которая требует фрагмента кода, который будет ждать х секунд, чтобы узнать, вводит ли пользователь что-либо , и если ввод данных не поступает, то необходимо выполнить еще один код. Такая вещь также будет содержаться в цикле for, так что, как только будет выполнен дополнительный код, он снова ждет конечный период времени для ввода. Если ввод задается с помощью нажатия клавиши, код затем продолжает выполнять другой, но отличается кодом. Первоначально я попытался решить эту проблему, используя петлю while, <time.h>clock() и scanf(), но безрезультатно. Моя последняя попытка отличается тем, что, но все же не дает желаемого результата. Мой последний код выглядит следующим образом:Наличие C Ожидание конечного количества времени для ввода пользователя перед тем, как перейти к сценарию

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 

Я предрек все соответствующие файлы заголовков в верхней части моего сценария, но я теперь озадачен о том, как действовать, и я использую Windows. Любая помощь будет оценена по достоинству.

Большое спасибо

+0

Вы ищете [ 'sleep'] (http://man7.org/linux/man-pages/man3/sleep.3.html)? –

+0

Вы хотите проверить, что пользователь вводит что-то в течение некоторого интервала времени. – sas

+2

Нет, не 'sleep', так как это приостановит выполнение, которое почти то, чего я пытаюсь избежать, так как' fgets' и 'scanf' делают это, но indefinetely. Я предполагаю, что я ищу еще что-то, о чем @sas упомянул, и хочу проверить, ввел ли пользователь что-то в течение интервала времени и прогресс, если нет. – dbr

ответ

0

Ну, в вашем случае, потому что вы ждете на входе пользователей, select() или poll() будет хороший выбор.

+1

Сделали попытки сделать некоторые чтения на них тоже, но, будучи новичком на C, я не совсем уверен, что полностью понимаю, как их использовать. Не могли бы вы написать короткий типичный пример, который я мог бы попробовать и, пожалуйста, придумать? – dbr

3

Для этого в стандартном варианте нет подходящего решения. time.h не подходит для этой задачи.

Оперативные системы имеют различные нестандартные библиотеки API, которые предоставляют такую ​​функциональность, обычно в форме события, которое вызывает функцию обратного вызова.

Поскольку вы не указали, какую систему вы используете, не удастся дать хороший ответ.


EDIT

В Windows вы можете использовать Windows console API через windows.h. Вот пример того, как проверить, если нажата клавиша, без блокировки программы в занятых-ожиданиях:

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

Я использую Windows, если это помогает. – dbr

+2

@DeanBrunt Вы должны были включить это с вопросом. Люди уже предлагают различные решения Unix ... Теперь, вероятно, вам нужен консольный API Windows. Я отредактирую сообщение. – Lundin

+0

Обратите внимание, что я далек от эксперта по Windows API. Если вы помечаете свой вопрос «окна» и «winapi», вы привлечете внимание таких зверей. – Lundin

3

Вы должны использовать выберите тайм-аут, а затем выполнить IO. Отправной точкой может быть:

#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

Я отредактировал свое оригинальное сообщение, чтобы отразить это, но я использую окна, которые не поддерживают '' из того, что я вижу. Я попытался использовать эквивалент, предложенный в другом месте в '', но это также не сработало. – dbr

+0

Но select() совместим с Posix ... возможно, файлы заголовков для включения немного отличаются. –

+0

@DeanBrunt «Использование окон» - это операционная система, а не компилятор. Компиляторы существуют для окон, которые этот код компилирует. (просто сделал это). Не согласен с [@Basile Starynkevitch] (http://stackoverflow.com/questions/41061571/having-c-wait-for-a-finite-amount-of-time-for-a-user-input-before-moving- на с # comment69331312_41061571). Решение не является специфичным для ОС, а специфичным для компилятора. – chux