You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多线程C应用中无需循环实现条件等待的方案咨询

WINAPI多线程应用优化需求

我基于WINAPI开发多线程应用,包含三个核心线程:

  • WinMain线程:负责接收并处理Windows消息
  • 后台视频线程:以无限循环持续运行,处理后台视频播放逻辑
  • 菜单控制线程:需等待WinMain回调的信号,更新按钮、滑块等事件驱动控件,仅在用户操作(鼠标移动/按键)时执行

现有代码实现

消息回调函数

LRESULT CALLBACK MainHandleMsg(HWND _MainHandle,UINT uMsg,WPARAM wParam,LPARAM lparam){
    switch(uMsg){
        case WM_DESTROY:
            PostQuitMessage(0);
            break;
        case WM_KEYDOWN:
        case WM_SYSKEYDOWN:
        case WM_MOUSEMOVE:
        case WM_MOUSEWHEEL:
        // 捕获所有按键、鼠标移动/滚轮事件
            update++;
            break;
        case WM_CLOSE:
        case WM_QUIT:
        _exit(0);
    }
    return DefWindowProcW(_MainHandle,uMsg, wParam, lparam);
}

后台视频播放线程

void *BackGroundFunc(void *vargp){
     while(1){
         /*
          * 后台视频播放逻辑代码
          */
     }
}

当前菜单控制线程(存在轮询负载问题)

void *MenuControlFunc(void *vargp){
     while(1){
         if(update < 1)
             continue;
          
         /*
          * 根据累计的按键/鼠标事件数量更新菜单控件
          */
          update = 0; // 重置更新标志
     }
}

核心优化诉求

  1. 希望找到无需轮询循环的实现方式,让菜单控制线程可以阻塞等待update变量的变化,类似ReadFile阻塞等待串口字符到达、scanf等待标准输入的机制
  2. 想了解这类阻塞式函数的本质是否也是底层循环检查
  3. 当前已通过循环缓冲区部分解决了「主线程负载低、菜单处理线程因轮询负载高导致事件丢失」的问题,但仍需彻底优化轮询逻辑

内容的提问来源于stack exchange,提问作者Sammy1410

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 19:05:27