Задержка ввода _getch()

Итак, у меня есть этот фрагмент кода, в котором, я думаю, мне нужно отложить ввод _getch, чтобы дать время для завершения cout. В настоящее время рассылка спама или удерживание соответствующей кнопки собирает входные данные быстрее, чем я могу обновить консоль и каким-то образом сохранить их, поэтому после отпускания кнопки требуется некоторое время для завершения обновления и печати.

Я пытался очистить ожидающие couts, однако я не смог этого сделать. Я также пытался поставить Sleep() перед _getch(), но это просто не работает.

Редактировать

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

Я также был бы заинтересован в более быстром способе вывода огромных массивов 2D-символов или оптимизации обновлений консоли.

while (inp != 27)
{
    if (inp == 72) cordx -= 1; //up
    if (inp == 80) cordx += 1; //down
    if (inp == 75) cordy -= 1; //left
    if (inp == 77) cordy += 1; //right

    //cout of a huge char array, repeated every input 


    inp = _getch();
    coordScreen = { 100, 0 };
    SetConsoleCursorPosition(hConsole, coordScreen);
}

person Laczek    schedule 27.12.2019    source источник
comment
Возможно, взгляните на flush() как на что-то, чтобы попробовать   -  person mrflash818    schedule 28.12.2019
comment
К сожалению, это не работает для меня. Хотя я должен был упомянуть, что я также пробовал все методы очистки и очистки буфера, которые я мог найти и понять. Сейчас отредактирую! Тем не менее спасибо за ваш вклад!   -  person Laczek    schedule 28.12.2019
comment
Что-то, что дает больше информации, чем может быть обработано, довольно распространено. Вам нужно будет решить, нужно ли вам обрабатывать все входные данные, которые может обработать вывод, или вы можете отказаться от старой (неважной) информации. Программа Apollo (код) предложила блестящую идею расстановки приоритетов. Вы делаете игру? Важно ли идти влево, если следующим идет движение вправо, а ваш игровой движок еще не видел первую команду?   -  person Ted Lyngmo    schedule 28.12.2019
comment
Это больше похоже на эксперимент, возможно, когда-нибудь я превращу его во что-то большее. Очень важно регистрировать все входные данные, просто команда _getch() регистрируется намного быстрее, чем я могу реально вывести кусок карты 40x40 вокруг игрока, что приводит к серьезным задержкам во время длительного движения, когда вам нужно ждать до 10 секунд для завершения всего движения, что может немного раздражать движение. Если кто-то будет не спамить и не удерживать кнопку, а нажимать ее в правильном темпе, все будет отлично. Поэтому я хотел бы, чтобы он обрабатывал как можно больше входных данных.   -  person Laczek    schedule 28.12.2019
comment
Рассмотрите возможность использования _kbhit(). Просто ничего не отображайте, когда он возвращает ненулевое значение.   -  person Hans Passant    schedule 28.12.2019
comment
_kbhit() сделал это. Это даже ускорило обновление консоли! Всем большое спасибо!   -  person Laczek    schedule 28.12.2019


Ответы (1)


Благодаря всеобщей поддержке это выяснилось. Делая cout зависимым от _kbhit(), все решилось, заставив консоль пропускать «кадры» в случае чрезмерного нажатия кнопок, в целом делая использование программы более приятным и беспроблемным. Обновленный код ниже:

if (inp == 72/* && TAB[cordx - 1][cordy] == true*/) cordx -= 1; //up
    if (inp == 80/* && TAB[cordx + 1][cordy] == true*/) cordx += 1; //down
    if (inp == 75/* && TAB[cordx][cordy - 1] == true*/) cordy -= 1; //left
    if (inp == 77/* && TAB[cordx][cordy + 1] == true*/) cordy += 1; //right

    if (_kbhit()==0)
    {
        //cout of a huge char array, repeated every input 
    }
    inp = _getch();
    coordScreen = { 100, 0 };
    SetConsoleCursorPosition(hConsole, coordScreen);
}
person Laczek    schedule 28.12.2019