gpt4 book ai didi

c - 如何将 Windows 消息从一个线程传递到另一个线程?

转载 作者:行者123 更新时间:2023-11-30 16:18:32 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

这是经典Producer-Consumer problem 。您可以在线查找实现示例。

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

当主线程访问数组时(即当您读取键码时),您可以使用互斥体或信号量锁定数组。当 key 被添加到数组中时,锁被释放。

在使用者线程上,在尝试访问数组之前,您等待信号量/互斥体解锁,锁定它,使用其中的 key ,然后释放锁。

请注意,这个解决方案就性能而言会比从主线程管理 key 慢。当你锁定一个线程时,它基本上会停止工作,直到你解锁它。因此,如果您的消费者线程除了等待主线程之外没有做其他工作,那么锁定/解锁、切换上下文等的成本将增加程序的开销。

关于c - 如何将 Windows 消息从一个线程传递到另一个线程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55870904/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com