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));
}
Другие вопросы по тегам