我目前正在开发一款简单的游戏,但我对其中一个核心机制感到非常难过。我希望能够运行每秒钟左右更新信息(例如货币,位置等)的后台循环。但是,我希望用户能够在不中断循环的情况下随时输入操作。然后,这些操作将改变后台循环更新信息的方式。我最近的尝试是同时运行两个线程。一个将运行后台时钟,一个将持续打开输入并做出适当反应。但是,我发现输入线程很难影响后台线程。他们都只是在自己的小世界里奔跑。
有关如何处理此问题的任何想法?多线程是正确的方法吗?任何帮助,将不胜感激 :)。如果需要,我可以展示我的一些代码。
答案 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;
}