Как бы я постоянно обновлял переменную и одновременно ждал ввода? - PullRequest
0 голосов
/ 17 марта 2019

В своем небольшом проекте я решил создать игру, которая обновляет счетчик очков опыта пользователя каждую секунду, а также печатать меню и позволять пользователю одновременно перемещаться по указанному меню. Код для обновления пользовательского опыта выглядит следующим образом, и он прекрасно работает автономно.

double timerX = GetTickCount();  
double timerY = GetTickCount();  
while(true)                                                                            
{

   double timerZ = GetTickCount() - timerX;
   double timerA = GetTickCount() - timerY;

       if(timerZ >= 1000) {    
        userExperience = userExperience + 1;
        timerX = GetTickCount();
    }
        if(timerA >= 1100) {
            system("CLS");
            refreshExperience();
            timerY = GetTickCount();
        }

Функция refreshExperience () просто выводит переменную userExperience на экран с помощью cout.

Одновременно с этим моя программа должна иметь возможность отображать графический интерфейс главного меню и запрашивать ввод от пользователя. Тем не менее, я не хочу, чтобы запрос ввода останавливал программу, особенно средство обновления денег, поскольку крайне важно, чтобы оно постоянно обновлялось. Я пытался использовать многопоточность, создавая поток для функции «refreshExperience», а также создавая поток для запроса ввода, но проблема все еще оставалась - деньги обновлялись бы только в том случае, если пользователь непрерывно вводил (нажимая клавиши). Если бы он не был, деньги остались бы прежними.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 17 марта 2019

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

По этой же причине вам следует инициализировать переменные перед их объявлением;если вы этого не сделаете, переменные, размещенные в стеке, будут содержать случайные (для вас) данные, и программа не будет работать так, как задумано.Концептуально, это та же самая проблема, с которой сталкивается консоль, за исключением того, что она не обладает роскошью свободной воли и не может просто пропустить ожидание.

Концептуально программы с пользовательским интерфейсом работают, работаяс петлей.Каждое событие, от движения мыши до нажатия кнопки, запускает событие в процедуре Window. В Win32 API это просто оператор switch, который проверяет каждое возможное событие на предмет того, что действительно произошло.Когда есть совпадение, система запускает этот обработчик события.

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

Наконец, я очень рекомендуюдругой метод для обновления табло.Я знаю, что это просто надуманный пример для экспериментов с вами, но это означает, что он также хорош, если не лучше, для опробования некоторых шаблонов проектирования, а именно шаблона наблюдателя.Вместо того, чтобы программа проверяла входные данные каждый возможный тактовый цикл, это просто пустая трата времени.Когда у вас такая ситуация, обычно используют функции обратного вызова , которые в C - это просто указатели функций, которые вы передаете.Таким образом, вам не нужно проверять, когда происходит событие, вы можете просто заставить событие вызывать функцию, которую вы передали в качестве параметра. Кстати, именно так работает Node.js , и, похоже, он так много делает сразу, несмотря на то, что является однопоточным.

Если вы слышали что-нибудь о программировании Reactive в последнее время* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * Я говорю об этом, и вот почему я об этом говорю, потому что это один из наиболее распространенных, хотя и тривиальных вопросов.Примеры сценариев реактивного программирования из учебника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...