在接收输入时运行后台循环 (C++)



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

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

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

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

您可以轻松地在谷歌上搜索解决方案,因为这种类型的问题非常"经典"。

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

最新更新