@XerimHD

Как сделать чтоб одна вункция роботала всегда а другая паралельно каждую секунду?

void game_loop(bool &star_placed, bool &staircase_placed, int &c, bool &t_placed, int &r_placed, bool &p_placed, int rows, int cols, vector<vector<char>> &map)
{
// код игры 
}
void monster_move(vector<vector<char>> &map)
{
// движения монстров 
this_thread::sleep_for(chrono::seconds(1));
}
 void menu(bool &star_pleced, bool &staircase_placed, int &c, bool &t_placed, int &r_placed, bool &p_placed, int rows, int cols, vector<vector<char>> &map)
{
do
                {
                    thread gameThread(game_loop, ref(star_pleced), ref(staircase_placed), ref(c), ref(t_placed), ref(r_placed), ref(p_placed), rows, cols, ref(map));
                    thread monsterThread(monster_move, ref(map));
                    gameThread.join();
monsterThread.join();

                    refresh();
                } while ((c = getch()) != '0');
}


что не так подскажите,если вот так,как я сделала тогда весь код тормозит на 1 секунду
  • Вопрос задан
  • 174 просмотра
Решения вопроса 2
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
{
  thread gameThread(game_loop, ref(star_pleced), ref(staircase_placed), ref(c), ref(t_placed), ref(r_placed), ref(p_placed), rows, cols, ref(map));
  thread monsterThread(monster_move, ref(map));
  gameThread.join();
  monsterThread.join();
  refresh();
} while ((c = getch()) != '0');


Этот код запускает потоки (они один раз исполняются) потом ждет их завершения. И это в цикле.
Проблема в том, что на каждой итерации этого цикла вы будете ждать, пока monster thread спит.

Потоки тут вообще бесполезны, вы с тем же успехом можете просто вызвать функции напрямую.

Потоки должны быть запущены один раз и работать в фоне. Тот, который каждую секунду что-то делает, должен внутри содержать цикл и работать бесконечно, на каждой итерации засыпать на 1 секунду.
Ответ написан
Комментировать
@Mercury13
Программист на «си с крестами» и не только
Итак.
1. В играх очень хорош объектный подход — что-то вроде
class World {
public:
  bool wasStarPlaced = false;
  bool wasStaircasePlaced = false;
  std::vector<std::vector<char>> map;
  unsigned long long tick = 0;  // пригодится ещё
  void update();  // стандартное название для функции «исполнить игровой такт»
};

Тут даже не нужны все каноны ООП, достаточно что-то вроде «поле X принадлежит объекту Y».

2. Многопоточка чревата гонками по данным, и если в многопоточку не стоит — пожалуйста, не делайте! В данном случае вы хотите что-то вроде: каждую секунду выполнять дополнительную ветку.

Как я понял, игра динамичная, и расчёты в ней достаточно простые, чтобы вести их с постоянной частотой (например, 60 тактов/с).
constexpr int TICKS_PER_SEC = 60;

void World::update()
{
  ++tick;
  if (tick % TICKS_PER_SEC == 0) {
     // происходит каждые 60 тактов
  }
}
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
22 нояб. 2024, в 03:54
1500 руб./за проект
22 нояб. 2024, в 02:56
10000 руб./за проект
22 нояб. 2024, в 00:55
500 руб./за проект