在输入时运行背景循环(C ++)

时间:2018-05-19 01:34:33

标签: c++ multithreading visual-studio loops

我目前正在开发一款简单的游戏,但我对其中一个核心机制感到非常难过。我希望能够运行每秒钟左右更新信息(例如货币,位置等)的后台循环。但是,我希望用户能够在不中断循环的情况下随时输入操作。然后,这些操作将改变后台循环更新信息的方式。我最近的尝试是同时运行两个线程。一个将运行后台时钟,一个将持续打开输入并做出适当反应。但是,我发现输入线程很难影响后台线程。他们都只是在自己的小世界里奔跑。

有关如何处理此问题的任何想法?多线程是正确的方法吗?任何帮助,将不胜感激 :)。如果需要,我可以展示我的一些代码。

2 个答案:

答案 0 :(得分:1)

简单方法:如果更新过程没有花费太多时间,则在用户进行任何更改后立即更新信息。这样您就不需要多线程了。基本思路,如果有变化则更新。

高级方法:你将有2个帖子。第一个线程从用户接收操作,对其进行排队。第二个线程读取队列中的操作并根据操作更新信息。 看起来像这样: INPUT线​​程 - > [上,下,......,左,右,上] - >更新线程

您可以轻松谷歌解决方案,因为这类问题非常“经典”。

答案 1 :(得分:1)

有很多方法可以在线程之间共享信息。这只是一个例子。您还可以使用全局范围或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;
}