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

标签 c multithreading winapi

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

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/

相关文章:

c - 在 OpenCL 中等待单个事件

c# - 如何向应用程序添加暂停/恢复功能?

winapi - 寻找 WaitForInputIdle 函数的替代方案,随时可用

c++ - 强制完整性级别值 0x2010 代表什么?

C快速计算下一个4的倍数?

c++ - 在拖动窗口或按住菜单按钮期间,如何阻止 Windows 阻止程序?

c - MSBuild 无法从 CLI 构建。无效的静态调用语法

multithreading - Rust 的并行扩展性差

c# - 在后台运行任务但在 ASP MVC Web 应用程序中返回响应给客户端

c# - GetSystemInfo() 为最大应用程序地址返回不同的值