C++: GetAsyncKeyState() не регистрирует нажатие клавиши сразу
В программе, которую я пишу, когда я нажимаю клавишу "escape", я хочу, чтобы она регистрировалась немедленно, даже во время периода ожидания. В настоящее время он ожидает до конца оператора сна, прежде чем регистрировать нажатие клавиши. Время сна важно для программы, поэтому не нужно просто добавлять паузу и ждать ввода пользователя.
int main()
{
bool ESCAPE = false; // program ends when true
while (!ESCAPE) {
// Stop program when Escape is pressed
if (GetAsyncKeyState(VK_ESCAPE)) {
cout << "Exit triggered" << endl;
ESCAPE = true;
break;
}
Sleep(10000);
}
system("PAUSE");
return 0;
}
РЕДАКТИРОВАТЬ: Чтобы уточнить, причина сна заключается в том, что я выполняю действие несколько раз в течение интервала времени.
1 ответ
Решение
Вместо того, чтобы спать в течение 10 секунд, вы можете проверить, прошло ли 10 секунд, и сделать все, что нужно сделать в этот момент. Таким образом, цикл постоянно проверяет нажатие клавиш.
#include <chrono>
...
auto time_between_work_periods = std::chrono::seconds(10);
auto next_work_period = std::chrono::steady_clock::now() + time_between_work_periods;
while (!ESCAPE) {
// Stop program when Escape is pressed
if (GetAsyncKeyState(VK_ESCAPE)) {
std::cout << "Exit triggered" << std::endl;
ESCAPE = true;
break;
}
if (std::chrono::steady_clock::now() > next_work_period) {
// do some work
next_work_period += time_between_work_periods;
}
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}