Итак, что я пытаюсь сделать, так это создать функцию на C++, которая позволяет пользователю вводить что угодно и что угодно в строку в течение заданного промежутка времени (скажем, десять минут (или даже одну)) (и СОХРАНЯЙТЕ все, что они ввели, кстати. Я пытаюсь разработать игру, чтобы помочь участникам NaNoWriMo или авторам в целом подтолкнуть их к написанию, поэтому важно сохранить все) и then не позволяет добавлять входящие данные. Сначала это звучало просто, но пять часов гугления доказали обратное.
Во-первых, я подумал, что могу просто добавлять несколько раз, пока не истечет время или что-то в этом роде. Наблюдать:
int main() //testing
{
string str;
string app = " ";
getline(cin, app);
for (int i = 0; i <= 3; i++)
{
Sleep(5000);
cout << i << endl;
str = " ";
getline(cin, str);
app.append(str);
}
cout << app;
}
Но потом я понял, да,, что цикл не будет проверять условие снова, пока пользователь не нажмет Enter. Надоедливый. То же самое с моей умной идеей персонажа. Мне нужен был цикл, который обновлялся бы с каждым введенным символом (или с каждой прошедшей секундой), независимо от того, сколько времени потребуется пользователю, чтобы ввести еще один.
Итак, тогда я подумал: «Ну, останавливаться в каждом месте и обновлять время должно работать достаточно хорошо, да?»
Именно тогда я начал обнаруживать, что C++ плохо работает с разбором строк или чтением ввода по мере его поступления. Я подумал о добавлении каждого символа, так как с ним довольно легко найти пробел, но он все еще ждет пользователя.
Разочарованный, я задался вопросом, есть ли способ запустить программу одновременно с получением пользовательского ввода, чтобы когда время истекло (используя time(null), проходит время time(null) и вычитая два переменные для получения прошедших секунд).
Оказывается, есть! (Я знал, что должен быть, учитывая все компьютерные программы и игры, использующие этот принцип, но я новичок в программировании (в прошлую среду я изучил функции, чтобы дать вам представление), поэтому я не знал, что.)
Первыми функциями, на которые я наткнулся, были curses и ncurses, но я быстро обнаружил, что это действительно неподходящий вариант для того, что я хочу сделать (поскольку я слышал, что cout делает довольно забавные вещи).
Затем я наткнулся на kbhit, который распознает нажатие клавиш на клавиатуре. Этот блог кажется многообещающим, и, вероятно, то, что я хочу сделать, но я не уверен, на каком языке это написано. . . все, что я знаю, это то, что он плохо работает с моей C++ IDE. Я понятия не имею, как заставить его хорошо работать с C++.
Итак, повторение того, что я хотел бы:
Цикл, который содержит одновременное выполнение счетчика времени и пользовательского ввода (в строку), но завершается (перестает позволять пользователю вводить дальнейшие данные в строку) по истечении времени. (Все без выполнения забавные вещи к остальной части моей программы, как ncurses.)
Дополнительно: я запускаю Windows 8 (проклятие моего существования) и использую Code::Blocks в качестве своей IDE.
Или, если у вас есть, где-то на этот вопрос уже был дан ответ. Это на самом деле было бы здорово. Я бы чувствовал себя глупо, если бы не смог его найти.
(Вот несколько мест, которые я посмотрел по пути:
Ввод данных пользователем во время работы программы
Как читать ввод из стандартного ввода, пока не будет нажат пробел или табуляция?
Захват символов из стандартного ввода без ожидания введите для нажатия )
(Игра, которую я пытаюсь создать (которая еще совсем не за горами, я начал ее прошлой ночью), если вам интересно: https://github.com/Rowan-Law/Dungeon-Crawl/blob/master/Source%20Code )
std::cin
ожидает, пока пользователь нажмет Enter, вы не сможете его прервать. Все, что вы можете сделать, это проверить прошедшее время после того, как пользователь нажал клавишу ввода (для этого вам даже не нужна многопоточность). Если вам нужен больший контроль над низкоуровневыми операциями, связанными с вводом текста на консоли, вам нужно сообщить нам, какую ОС и компилятор вы используете. - person Christian Hackl   schedule 22.02.2015