2012-03-05 2 views
0

Я пробовал различные настройки с вводом и одним таймером, но ничего не работает. Весь код останавливается, когда он достигает части, запрашивающей ввод. У меня есть небуферизованный поток, поэтому мне не нужно нажимать enter для отправки ввода. Также цель этого - для игры pac-man, которую я разрабатываю для использования на терминале. Я хочу, в основном, иметь один второй интервал, когда пользователь может ввести команду. Если команда не введена, я хочу, чтобы pac-man продолжал перемещать направление, в котором он двигался, в последний раз, когда была введена команда.Как установить ограничение времени на ввод пользователя?

EDIT:

time_t startTime, curTime; 

    time(&startTime); 
    do 
    { 
     input=getchar(); 
     time(&curTime); 
    } while((curTime - startTime) < 1); 

ответ

0

Моя интуиция подсказывает мне, это:

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

Убедитесь, что ваш доступ к очереди синхронизирован.

// I/O Thread: 
while (!stop) { 
    input = getchar(); 
    lock_queue(); 
    queue.push_back(input); 
    unlock_queue(); 
} 

// Timer Thread: 
while (!stop) { 
    lock_queue(); 
    if (queue.size() == 0) { 
     action = DEFAULT_ACTION; 
    } else { 
     // either handle multiple key events somehow 
     // or use the last key event: 
     action = queue.back(); 
     queue.clear(); 
    } 
    unlock_queue(); 
    perform_action(action); 
    sleep(); 
} 

Полный пример представлен как Github Gist.

+0

Не могли бы вы указать мне хороший учебник по темам? Спасибо –

+1

Первый результат поиска «posix threads» в google: https://computing.llnl.gov/tutorials/pthreads/. Я бы не знал себя лучше, но * posix threads * - это то, что вы хотите. – Irfy

+0

Этот код хорош как есть? Кажется, что эти циклы 'while' будут работать одновременно. –

2

Вы можете попробовать использовать alarm() (или аналогичную функцию таймера), чтобы бросить и иметь приложение поймать SIGALRM, хотя это, безусловно, избыточна для PacMac. Рассмотрите возможность использования отдельного потока (поток POSIX) для управления таймером.

0

Вы можете использовать неблокирующую функцию ввода, такую ​​как getch(), но она не очень совместима с кросс-платформой.

В идеале вы должны использовать события для обновления состояния игры, в зависимости от того, на какой ОС вы нацеливаетесь, вы можете использовать события ОС для нажатия клавиши или, возможно, библиотеки, например SDL.

1

В Unix вы можете просто использовать выбор или опрос с таймаутом в стандартном дескрипторе входного файла (STDIN_FILENO или fileno (stdin)). Для этого я бы не привел ловушки для мыши, построенные из сигналов и потоков.

+0

+1. Создание отдельного потока для всего - это своего рода болезнь Java ... Эти люди сильно ошибочны. –

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