多线程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; // 重置更新标志 } }
核心优化诉求
- 希望找到无需轮询循环的实现方式,让菜单控制线程可以阻塞等待
update变量的变化,类似ReadFile阻塞等待串口字符到达、scanf等待标准输入的机制 - 想了解这类阻塞式函数的本质是否也是底层循环检查
- 当前已通过循环缓冲区部分解决了「主线程负载低、菜单处理线程因轮询负载高导致事件丢失」的问题,但仍需彻底优化轮询逻辑
内容的提问来源于stack exchange,提问作者Sammy1410
相关产品推荐
相关产品推荐

