【发布时间】:2019-09-16 03:53:38
【问题描述】:
我正在编写一个控制台游戏引擎。其中的游戏循环在单独的线程函数中处理:
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;
}
没有线程这个函数可以正常工作,但是当游戏循环出来时,除了创建消息之外,没有收到来自内部的消息。所以问题是:如何使消息异步,以便我可以将键码推送到队列中,然后在游戏循环中检索它们?
我只有主进程,它执行引擎和一个线程。
【问题讨论】:
-
更好的方法不是使用消息,而是使用同步原语(事件等)。
-
@MichaelChourdakis 我可以使用互斥锁或事件,但控件本身不会触发,我需要以某种方式管理按键,因此它们将是连续的,并且游戏循环中没有繁重的循环可能会减慢速度,并且控件本身不会持有线程
-
PostMessage() 将关键消息发送到另一个线程并使用另一个 getMessage 循环在那里检索它们。
-
@MartinJames 的主要问题是,它不会捕获任何消息。我做了一个 PeekMessage 循环,如果没有消息,它不会保持线程,但没有单个
-
@IlyaPakhmutov UI 窗口具有线程关联。只有创建窗口的线程才能接收该窗口的消息。要执行您的要求,您需要在游戏线程中创建一个(隐藏)窗口,以便您可以使用
(Post|Send)Message()向该窗口发布/发送消息。或者,使用PostThreadMessage()将消息发布到线程本身。
标签: c multithreading winapi