Запуск фонового цикла во время ввода (C ++) - PullRequest
0 голосов
/ 19 мая 2018

В настоящее время я работаю над созданием простой игры, но я довольно сильно озадачен одной из основных механик.Я хочу иметь возможность запускать фоновый цикл, который обновляет информацию (например, валюту, местоположение и т. Д.) Каждую секунду или около того.Однако я хочу, чтобы пользователь мог вводить действия в любой момент, не прерывая цикл.Эти действия затем изменят способ обновления информации в фоновом цикле.Моей последней попыткой было запустить два потока одновременно.Тот, который будет запускать фоновые часы, и тот, который будет постоянно открыт для ввода и реагировать соответствующим образом.Тем не менее, мне было трудно повлиять на поток ввода на фоновый поток.Они оба просто бегали в своем собственном маленьком мире.

Есть идеи, как подойти к этому вопросу?Является ли многопоточность правильным подходом?Любая помощь будет оценена :).Я могу показать некоторые из моего кода, если это будет необходимо.

Ответы [ 2 ]

0 голосов
/ 19 мая 2018

Существует множество способов обмена информацией между потоками.Это всего лишь пример.Вы также можете использовать глобальную область или обмен сообщениями IPC.

#include <iostream>
#include <boost/date_time/posix_time/posix_time.hpp>
#include <boost/thread/thread.hpp>

using namespace std;
using namespace boost::posix_time;

typedef struct program_data_t {
    program_data_t() : counter(0) { }

    int counter;
    boost::mutex mutex;
} program_data_t;

void update_loop(program_data_t* pd) {
    while(1) {
        boost::this_thread::sleep(milliseconds(50));

        boost::mutex::scoped_lock(pd->mutex);

        pd->counter++;
    }
}

void print_loop(program_data_t* pd) {
    while(1) {
        boost::this_thread::sleep(seconds(1));

        boost::mutex::scoped_lock(pd->mutex);

        cout << pd->counter << endl;
    }
}

int main() {
    program_data_t pd;

    boost::thread update_thread(boost::bind(update_loop, &pd));
    boost::thread print_thread(boost::bind(print_loop, &pd));

    update_thread.join();
    print_thread.join();

    return 0;
}
0 голосов
/ 19 мая 2018

Простой метод: обновите информацию сразу после того, как пользователь внесет какие-либо изменения, если процедура обновления не занимает слишком много времени.Таким образом, вам не нужно многопоточность.Основная идея, если есть изменения, то обновите.

Расширенный метод: у вас будет 2 потока.Первый поток получает действие от пользователя, ставит его в очередь.Второй поток читает действие в очереди и обновляет информацию в соответствии с действием.Выглядит примерно так: Тема INPUT -> [вверх, вниз, ..., влево, вправо, вверх] -> Тема UPDATE

Вы можете легко найти решение Google, потому что этот тип проблемы довольно «классический».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...