2013-08-17 3 views
5

Мы знаем, что функция ввода или оператор (cin, scanf, gets ... .etc) ждут ввода формы ввода пользователя & на этот раз не имеет предела.Как отключить инструкцию ввода через некоторое время?

Теперь я задам вопрос & пользователь дает ответ, до сих пор нет проблем, но моя проблема заключается в том, что «пользователь имеет время (может 30 или 40 секунд), чтобы дать ввод, если он не сработает, то инструкция ввода будет автоматически деактивируется & выполнить следующее заявление. "

Я думаю, что вы получите мою проблему. Тогда, пожалуйста, помогите мне в этой ситуации. Будет лучше, если кто-нибудь даст мне действительно действующий примерный код.

Я использую codebolck 12.11 в окнах 7.

+4

Стандарт C++ не имеет ничего, чтобы помочь вам. Вам нужно использовать более или менее злые OS-специфические трюки. –

+1

Спасибо за ваш ответ. Можете ли вы дать мне какой-то пример или функцию, пожалуйста. – Xplosive

+0

Нет, потому что я не знаю, что такое ваша ОС. –

ответ

10

подход для * IX'ish систем (в том числе Cygwin на окнах):

Вы можете использовать alarm() запланировать SIGALRM, а затем использовать read(fileno(stdin), ...).

Когда сигнал read() возвратится с -1 и поставил errno в EINTR.

Пример:

#define _POSIX_SOURCE 1 

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
#include <unistd.h> 
#include <signal.h> 
#include <errno.h> 

void handler_SIGALRM(int signo) 
{ 
    signo = 0; /* Get rid of warning "unused parameter ‘signo’" (in a portable way). */ 

    /* Do nothing. */ 
} 

int main() 
{ 
    /* Override SIGALRM's default handler, as the default handler might end the program. */ 
    { 
    struct sigaction sa; 
    memset(&sa, 0, sizeof(sa)); 

    sa.sa_handler = handler_SIGALRM; 

    if (-1 == sigaction(SIGALRM, &sa, NULL)) 
    { 
     perror("sigaction() failed"); 
     exit(EXIT_FAILURE); 
    } 
    } 

    alarm(2); /* Set alarm to occur in two seconds. */ 

    { 
    char buffer[16] = { 0 }; 

    int result = read(fileno(stdin), buffer, sizeof(buffer) - 1); 
    if (-1 == result) 
    { 
     if (EINTR != errno) 
     { 
     perror("read() failed"); 
     exit(EXIT_FAILURE); 
     } 

     printf("Game over!\n"); 
    } 
    else 
    { 
     alarm(0); /* Switch of alarm. */ 

     printf("You entered '%s'\n", buffer); 
    } 
    } 

    return EXIT_SUCCESS; 
} 

Примечание: В приведенном выше примере блокирующего вызова read() будет interupted на прибывших сигнал. Код, чтобы избежать этого остается в качестве execise к читателю ... :-)

2

Другой метод:
Вы можете использовать POSIX select() функции (и некоторые макросы FD_ZERO, FD_SET, FD_ISSET), чтобы проверить, какой файл дескрипторы (номер дескриптора 0, т. е. stdin, в этом случае) готовы к чтению за определенный промежуток времени. Когда они будут готовы, используйте соответствующую функцию для чтения данных (scanf() в этом случае).
Этот код может помочь вам понять, что я хочу сказать:

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

#define STDIN 0 // Standard Input File Descriptor 
int main() 
{ 
    fd_set input;  // declare a "file descriptor set" to hold all file descriptors you want to check 
    int fds, ret_val, num; // fds: Number of file descriptors; 

    struct timeval tv;  // structure to store Timeout value in the format used by select() function 
    unsigned int timeout = 5; // Your timeout period in seconds 

    tv.tv_sec = timeout;  
    tv.tv_usec = 0; 

    fds = STDIN + 1;   // Set number of file decriptors to "1 more than the greatest file descriptor" 
       // Here, we are using only stdin which is equal to 0 

    FD_ZERO(&input);  // Initialize the set with 0 
    FD_SET(STDIN, &input);  // Add STDIN to set 

    printf("Enter a number within %d secs\n", timeout); 
    ret_val = select(fds, &input, NULL, NULL, &tv); 
       // We need to call select only for monitoring the "input file descriptor set" 
       // Pass rest of them as NULL 

    if (ret_val == -1)   // Some error occured 
     perror("select()"); 
    else if (ret_val > 0)  // At least one of the file descriptor is ready to be read 
    { 
//  printf("Data is available now.\n"); 
     if(FD_ISSET(0, &input))  // Check if stdin is set, here its not necessary as we are using STDIN only 
       // So ret_val>0 means STDIN is raedy to read 
     { 
      scanf("%d", &num); 
     } 
    } 
    else 
     printf("No data within five seconds.\n"); // select returns zero on timeout 

    return 0; 
} 

Подробнее Помощь: select(2)

Вы также можете попробовать использовать функцию опроса() доступны в (опять же стандартной функции POSIX), как альтернативу select(). См poll() & poll(2)

+3

Я просто хотел сделать то же предложение. (Иногда вы, возможно, захотите обрабатывать EINTR в предложении 'ret_val == -1'.) Для переноса этого в Windows обратите внимание на этот вопрос: http://stackoverflow.com/q/933745/1025391 – moooeeeep

+0

Спасибо @moooeeeep для ссылки !! Мне также было интересно, как подобный код может работать под управлением Windows. Я забыл упомянуть об этой непереносимости в своем ответе. –

+1

#include #include Мой компилятор не может найти такой файл заголовка. i use codebolck 12.11 – Xplosive

0
#include <cstddef> 
#include <ctime> 
#include <iostream> 
#include <conio.h> 

bool get_input (char *buffer, std::size_t size, int timeout) 
{ 
    std::time_t start = std::time (0); 
    std::size_t n = 0; 

    for (; ;) { 
    if (n == 0 && std::difftime (std::time (0), start) >= timeout) 
    return false; 

    if (kbhit()) { 
    if (n == size - 1) 
    break; 

    char ch = (int)getche(); 

    if (ch == '\r') { 
    buffer[n++] = '\n'; 
    break; 
    } 
    else 
    buffer[n++] = ch; 
    } 
} 

buffer[n] = '\0'; 

return true; 
} 

int main() 
{ 
char buffer[512] = {0}; 

if (!get_input (buffer, 512, 5)) { 
std::cout<<"Input timed out\n"; 
buffer[0] = '\n'; 
} 

std::cout<<"input: \""<< buffer <<"\"\n"; 
} 
+1

попробуйте эту программу, ее рабочий тон – Akshay

+0

Я запустил этот код в кодовых блоках 13.2 его рабочий режим после некоторого интервала времени программа заканчивается автоматически, используя этот код, можно ли использовать его для cin ???? – Akshay

+0

Этот код использует функциональные возможности нестандартного C, не POSIX, и при этом он является невысоким. – alk

Смежные вопросы