我正在编写一个控制台游戏引擎。游戏循环是通过单独的线程函数处理的:
hThread = CreateThread(
NULL,
0,
&_GameThread,
_self,
0,
&dwThreadID);
WaitForSingleObject(hThread, INFINITE);
_GameThread()
本身目前仅包含一个简单的while(1)
。非常简单。
我需要以某种方式管理游戏中的控件,因此我选择了制作消息窗口的方法,该方法将按下的按钮转换为某些数组,然后由线程中的函数将其处理为某些动作(移动,转动等)。 。还制作了一个函数,它将消息传递到隐藏的窗口:
int _DispMessage()
{
MSG msg;
int gResult;
if(gResult = GetMessageW(&msg, 0, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return gResult;
}
没有线程,此功能工作正常,但是当出现游戏循环时,除了创建消息外,没有从内部收到任何消息。所以问题是:如何使消息异步,以便我可以将键码推入队列,然后在游戏循环中检索它们?
我只有一个主进程,它执行引擎和一个线程。
答案 0 :(得分:0)
那是经典的Producer-Consumer problem。您可以在线查找实施示例。
基本思想是在主线程和将消耗您的键码的线程之间有一个共享内存数组。
当主线程访问数组时(即,您在读取键码时),您可以使用互斥量或信号量来锁定数组。将密钥添加到阵列后,将释放锁定。
在使用者线程上,尝试访问该数组之前,您需要等待信号量/互斥体被解锁,锁定它,使用它的密钥,然后释放该锁定。
请注意,这种解决方案(在性能方面)比从主线程管理密钥要慢。锁定线程后,它基本上会停止工作,直到您将其解锁。因此,如果您的使用者线程没有像等待主线程那样分开工作,则锁定/解锁,切换上下文等的开销将增加程序的开销。