博客
关于我
【MFC】主线程等待子线程退出函数(MsgWaitForMultipleObjects)
阅读量:640 次
发布时间:2019-03-15

本文共 2543 字,大约阅读时间需要 8 分钟。

MsgWaitForMultipleObjects函数介绍

01、目录

目录

  • 1.1 MsgWaitForMultipleObjects功能概述

    • 1.1.1 功能描述

      在阻塞状态下仍能响应消息,支持多个对象等待激发

    • 1.1.2 主要用途

      适用于多线程环境下,确保消息处理的及时性

02、函数介绍

2、函数介绍

2.1 功能概述

MsgWaitForMultipleObjects()函数的作用是允许在阻塞状态下响应消息。这意味着当与之相关的对象被激发或消息到达队列时,函数会被唤醒并返回。

2.2 函数参数说明

  DWORD MsgWaitForMultipleObjects(    DWORD nCount,            // handles数组的元素个数    LPHANDLE pHandles,       // 指向handles数组    BOOL fWaitAll,           // 是否等待所有handles    DWORD dwMilliseconds,    // 超时时间    DWORD dwWakeMask          // 观察的消息类型掩码  );
  • nCount:表示pHandles数组的元素个数,最大值为MAXIMUM_WAIT_OBJECTS
  • pHandles:指向一个由多个对象句柄组成的数组,句柄类型不限
  • fWaitAll:布尔标志,设为TRUE时等待所有handles返回
  • dwMilliseconds:指定等待的超时时间
  • dwWakeMask:指定需要观察的用户消息类型掩码

2.3 函数返回值

  1. WAIT_TIMEOUT:因超时返回
  2. WAIT_OBJECT_0:当fWaitAll为TRUE时,表示所有handles都已被激发
  3. 若fWaitAll为FALSE,返回值为WAIT_OBJECT_0到WAIT_OBJECT_0 + nCount -1,表示具体哪个handle被激发
  4. WAIT_ABANDONED_0到WAIT_ABANDONED_0 + nCount -1:表示有任何mutex被放弃
  5. WAIT_FAILED:函数执行失败时返回
  6. WAIT_OBJECT_0 + nCount:消息到达队列时返回

2.4 使用注意事项

  • MsgWaitForMultipleObjects()应在主消息循环中使用
  • 通常只在一个地方调用该函数
  • 在处理WM_QUIT消息后,仍需继续处理消息以避免程序不响应
  • handles数组必须保持连续且无空隙,避免使用NULL处理
  • 多线程环境下需确保对handles数组的修改能够及时反映

03、示例

示例代码解析

void WaitForThreadExit(void){  DWORD dwRet;  MSG msg;  int wait_count = 4;  int nExitThreadCount = 0; while (1){dwRet = MsgWaitForMultipleObjects(wait_count, hArray, FALSE, INFINITE, QS_ALLINPUT); if (dwRet == WAIT_OBJECT_0 + wait_count){  while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))  {    if (msg.message == WM_QUIT || msg.message == WM_CLOSE)    {      break;    }    TranslateMessage(&msg);    DispatchMessage(&msg);  }}else if (dwRet >= WAIT_OBJECT_0 && dwRet < WAIT_OBJECT_0 + wait_count){  nExitThreadCount++;  if (nExitThreadCount < 4)  {    TRACE("一个线程退出了\n");    int nIndex = dwRet - WAIT_OBJECT_0;    hArray[nIndex] = hArray[wait_count - 1];    hArray[wait_count - 1] = NULL;    wait_count--;  }  else  {    TRACE("4个线程都退出了\n");    break;  }}else{  DWORD dErrCode = GetLastError();  break;} }}

示例说明:

该示例用于等待多个线程退出,通过MsgWaitForMultipleObjects()函数实现非阻塞消息处理。

在消息队列中,除了处理退出消息外,还需处理其他类型消息以避免程序卡死。

04、小结

总结

MsgWaitForMultipleObjects()函数为开发者提供了在多线程环境下处理消息和对象激发的强大能力。通过合理配置参数和正确处理返回值,可以有效避免死锁和性能问题。

Windows与Linux线程API对比:

在实际开发中,选择合适的线程API对性能和资源占用有重要影响。Windows的MsgWaitForMultipleObjects()函数提供了更灵活的消息处理机制,而Linux则通过pipe等方式实现类似功能。

转载地址:http://fsllz.baihongyu.com/

你可能感兴趣的文章
WPF画椭圆
查看>>
XMLHttpRequest对象的一个简单运用示例
查看>>
java文件上传
查看>>
DHCP跨网段分配IP地址
查看>>
10.多线程与并行
查看>>
Callable中call方法和Runnable中run方法的区别
查看>>
IDEA上移除项目(逻辑删除)
查看>>
Docker方式启动tomcat,访问首页出现404错误
查看>>
Docker方式启动tomcat,访问首页出现404错误(第二篇 -- 将修改过的容器映射成镜像)
查看>>
【蓝桥杯】 java 大学c组 省赛 1、隔行变色
查看>>
BIM轻量化——浏览器展示 | 利用unity
查看>>
超市账单管理系统
查看>>
Springboot实现热部署
查看>>
composer 介绍、安装及基本使用方法
查看>>
PHP 的 ::class 用法
查看>>
Python学习之列表用法
查看>>
升级qiime2
查看>>
Docker 阿里云CentOS 安装
查看>>
Bootstrap提交表单基本组件
查看>>
需求分析
查看>>