C语言 如何将Windows消息从一个线程传递到另一个线程?



我正在编写一个主机游戏引擎。其中的游戏循环在单独的线程函数中处理:

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;
}

没有线程,这个函数工作正常,但是当游戏循环出现时,除了创建消息外,不会从内部接收任何消息。所以问题是:如何使消息异步,以便我可以将键码推送到队列中,然后在游戏循环中检索它们?

我只有主进程,它执行引擎和一个线程。

这是一个典型的生产者-消费者问题。您可以在线查找实现示例。

基本思想是在主线程和将使用密钥代码的线程之间有一个共享内存数组。

当主线程访问数组时(即读取键码时),使用互斥锁或信号量锁定数组。将密钥添加到阵列后,锁将被释放。

在使用者线程上,在尝试访问阵列之前,请等待信号量/互斥锁解锁,锁定它,使用其中的密钥,然后释放锁。

请注意,此解决方案(就性能而言)将比从主线程管理密钥慢。当您锁定线程时,它基本上会停止工作,直到您解锁它。因此,如果您的使用者线程没有单独工作而不是等待主线程,那么锁定/解锁、切换上下文等的成本将增加程序的开销。

最新更新