Блокировка стандартного ввода во время сна - PullRequest
1 голос
/ 22 июня 2019

Я копирую консольную игру «Змея» и у меня проблемы с блокировкой ввода.

Я сделал функцию agetch (), которая обрабатывает ввод пользователя в отдельном потоке, блокирует ввод, когда программа спит, ивозвращает код символаЯ попробовал это с select () в Linux вместо потоков, но столкнулся с той же проблемой.Я думаю, что функция ужасна, и я надеюсь, что вы поможете мне исправить это:

#define nullptr ((void *) 0)

void* _agetch(void* arg)
{
    *(int32_t *) arg = getch();

    return nullptr;
}

int32_t agetch(uint32_t interval)
{
    int32_t status, status_addr;
    int32_t res = 0;

    pthread_t gp;
    status = pthread_create(&gp, nullptr, _agetch, &res);
    sleep(interval);

    if (res == 0)
        pthread_cancel(gp);
    else
        pthread_join(gp, (void**) &status_addr);

    return res;
}

int main()
{
    int32_t c;
    for (int32_t i = 0; i < 3; ++i) {
        c = agetch(3);
        if (c == 0) printf("Oops, timeout\n");
        else        printf("The char is %c\n" c);
    }

    return 0;
}

В первые 3 секунды я нажимал на клавиатуру 4 раза (например, "42ne"), и я ожидаю:

The char is 4
Oops, timeout
Oops, timeout

Но у меня есть:

The char is 4
The char is 2
The char is n
...