Я делаю многопоточную консольную игру, в которой мне нужно перемещать актера и отстреливать врагов. Перемещение и съемка - это два разных потока, и они оба должны прослушивать ввод с клавиатуры.
Я попытался прослушать ввод в цикле while в основной функции и передать его по адресу в оба потока, где бесконечное числоцикл обрабатывает этот символ, но таким образом актер просто прыгает в углы, я предполагаю, что эти циклы обрабатывают символ очень быстро, и персонаж остается неизменным даже после нажатия одной клавиши, поэтому поток перемещает актора каждый раз, когда циклположительно проверяет символ
Если я добавлю getchar()
в оба потока, будет работать только один из них.
int main() {
...
do {
cur_c = getchar();
if(!created){
pthread_create(&funcs[0], NULL, shot, (void *) &cur_c);
pthread create(&funcs[1], NULL, actor, (void *) &cur_c);
created = true;
}
if(...)
break;
} while (1);
...
}
}
void *actor(void *ch)
{
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
int *cur_char = ch;
while(1){
switch(*cur_char){
case 'w':
goUp();
break;
case 'a':
goLeft();
break;
...
}
}
pthread_exit(NULL);
}
void *shot(void *ch)
{
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL);
int *cur_char = ch;
while(1){
if(*cur_char == ' ') {
Position pos = ...;
fire(&pos);
}
}
pthread_exit(NULL);
}
Я ожидаю, что обе эти функции будут прослушивать ввод, но этоспособ: если я нажму ' '
, актер выстрелит один раз или, если я нажму 'w'
, поднимется один раз, и только после того, как я нажму любую другую клавишуУ меня вопрос: можно ли заставить getchar()
в отдельных потоках одновременно прослушивать вход? Если да, то как это возможно?