Я копирую консольную игру «Змея» и у меня проблемы с блокировкой ввода.
Я сделал функцию 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