Как получить два параллельных потока для прослушивания одного входа? - PullRequest
0 голосов
/ 14 октября 2019

Я делаю многопоточную консольную игру, в которой мне нужно перемещать актера и отстреливать врагов. Перемещение и съемка - это два разных потока, и они оба должны прослушивать ввод с клавиатуры.

Я попытался прослушать ввод в цикле 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() в отдельных потоках одновременно прослушивать вход? Если да, то как это возможно?

...