WaitForSingleObject 的用法_waitforsingleobject(m_hthread, 0)-程序员宅基地

WaitForSingleObject 的用法

				
DWORD
WaitForSingleObject(
                     HANDLE hHandle, 
                     DWORD dwMilliseconds				
                  );

参数 hHandle 是一个事件的句柄,第二个参数 dwMilliseconds 是时间间隔。如果时间是有信号状态返回 WAIT_OBJECT_0 ,如果时间超过 dwMilliseconds 值但时间事件还是无信号状态则返回 WAIT_TIMEOUT 

hHandle
 
可以是下列对象的句柄:
Change notification 
Console input 
Event 
Job 
Memory resource notification 
Mutex 
Process 
Semaphore 
Thread 
Waitable timer 
 

WaitForSingleObject 函数用来检测 hHandle 事件的信号状态,当函数的执行时间超过 dwMilliseconds 就返回,但如果参数 dwMilliseconds 为 INFINITE 时函数将直到相应时间事件变成有信号状态才返回,否则就一直等待下去,直到 WaitForSingleObject 有返回直才执行后面的代码。在这里举个例子:

先创建一个全局 Event 对象 g_event:

    CEvent g_event;

在程序中可以通过调用 CEvent::SetEvent 设置事件为有信号状态。

下面是一个线程函数 MyThreadPro()

UINT CFlushDlg::MyThreadProc( LPVOID pParam ) 
{

     WaitForSingleObject(g_event,INFINITE);
     For(;;)
        { 
         ………… .

        } 
     return 0; 

在这个线程函数中只有设置 g_event 为有信号状态时才执行下面的 for 循环,因为 g_event 是全局变量,所以我们可以在别的线程中通过 g_event. SetEvent 控制这个线程。

还有一种用法就是我们可以通过 WaitForSingleObject 函数来间隔的执行一个线程函数的函数体

     UINT CFlushDlg::MyThreadProc( LPVOID pParam )

     while(WaitForSingleObject(g_event,MT_INTERVAL)!=WAIT_OBJECT_0)
     {
         ………………  
     } 
     return 0;
 

在这个线程函数中可以可以通过设置 MT_INTERVAL 来控制这个线程的函数体多久执行一次,当事件为无信号状态时函数体隔 MT_INTERVAL 执行一次,当设置事件为有信号状态时,线程就执行完毕了。

2. WaitForSingleObject
当指定的对象处于有信号状态或者等待时间结束的状态时,此函数返回。
DWORD WaitForSingleObject(
  HANDLE hHandle,
  DWORD dwMilliseconds
);
参数:
hHandle:指定对象或事件的句柄;
dwMilliseconds: 等待时间,以毫妙为单位,当超过等待时间时,此函数将返回。如果该参数设置为0,则该函数立即返回,如果设置为INFINITE,则该函数直到有信号才返回。
返回值:
如果此函数成功,该函数的返回之标识了引起该函数返回的事件。返回值如下:
  WAIT_ABANDONED(0x00000080L)
  指定的对象是一个互斥对象,该对象没有被拥有该对象的线程在线程结束前释放。互斥对象的所有权被同意授予调用该函数的线程。互斥对象被设置成为无信号状态。
  WAIT_OBJECT_0 (0x00000000L)
  指定的对象出有有信号状态。
  WAIT_TIMEOUT (0x00000102L)
  超过等待时间,指定的对象处于无信号状态
如果失败,返回 WAIT_FAILED;
备注:
此函数检查指定的对象或事件的状态,如果该对象处于无信号状态,则调用线程处于等待状态,此时该线程不消耗CPU时间,
该函数可以等待如下对象:
  Change notification 
  Console input 
  Event 
  Job 
  Memory resource notification 
  Mutex 
  Process 
  Semaphore 
  Thread 
  Waitable timer 
需求:
Client Requires Windows XP, Windows 2000 Professional, Windows NT Workstation, Windows Me, Windows 98, or Windows 95. 
Server Requires Windows Server 2003, Windows 2000 Server, or Windows NT Server. 
Header Declared in Winbase.h; include Windows.h.   
Library Link to Kernel32.lib.    
DLL Requires Kernel32.dll.  

程序举例:
1、创建对话框应用程序,项目名称为MyTestThread
2、添加按钮,命名为启动和停止,在对话框中增加编辑框,ID为IDC_TIME,
3、增加成员变量,HANDLE m_hThread[2],此为线程的句柄;
4、定义全局变量,用来控制线程的运行与否;
   volatile BOOL m_ThreadRun[2];
5、增加全局事件对象,用来监控线程,控制线程是否运行。
   CEvent event;
   注意:4、5定义的对象,必须在.cpp文件中定义;
6、声明回调函数。回调函数必须是全局函数或静态函数。声明方式如下:
void ThreadFunc1(LPVOID pParam);
void ThreadFunc2(LPVOID pParam);
   回调函数的实现如下:
void ThreadFunc1(LPVOID pParam)
{
  CTime time;
  CString strTime;
  event.ResetEvent();
  m_ThreadRun[0] = true;
  m_ThreadRun[1] = true;
  DWORD ThreadID = ::GetCurrentThreadId();
  while(m_ThreadRun[0])
  {
   time = CTime::GetCurrentTime();
   strTime = time.Format("%H:%M:%S");
   CMyTestThreadDlg* pDlg = (CMyTestThreadDlg*)pParam;
   pDlg->SetDlgItemText(IDC_TIME,strTime);
   Sleep(1000);
  } 
}

void ThreadFunc2(LPVOID pParam)
{
  
  CTime time;
  CString strTime;
  DWORD ThreadID = ::GetCurrentThreadId();

//event为有信号状态,则下边的函数执行后,该线程则开始运行,如果event为无信号状态,则下边的函数执行

//后,该线程处于等待状态,直到有信号才开始运行;
  ::WaitForSingleObject(event,INFINITE);
  while(m_ThreadRun[1])
  {
   time = CTime::GetCurrentTime();
   strTime = time.Format("%H:%M:%S");
   CMyTestThreadDlg* pDlg = (CMyTestThreadDlg*)pParam;
   pDlg->SetDlgItemText(IDC_TIME,"OK");
   Sleep(1000);
   ::WaitForSingleObject(event,INFINITE);
  } 
}

7、定义保存线程ID的成员变量:DWORD m_ThreadID[2];
8、对启动和停止按钮增加消息响应函数,如下:
void CMyTestThreadDlg::OnBnClickedOk()
{
  // TODO: 在此添加控件通知处理程序代码
  m_hThread[0] = ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc1,this,0,&m_ThreadID[0]);
  m_hThread[1] = ::CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadFunc2,this,0,&m_ThreadID[1]);


  GetDlgItem(IDC_BUTTON1)->EnableWindow(false);
  GetDlgItem(IDC_BUTTON2)->EnableWindow(true);
}

void CMyTestThreadDlg::OnBnClickedCancel()
{
  m_ThreadRun[0] = false;
  event.SetEvent();
  GetDlgItem(IDC_BUTTON1)->EnableWindow(true);
  GetDlgItem(IDC_BUTTON2)->EnableWindow(false);
}

编译运行,设置断点,可以查看运行情况。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/h136397089/article/details/38063895

智能推荐

Linux命令:cd --程序员宅基地

文章浏览阅读79次。当用cd千辛万苦,翻山越岭,来到一个桃花胜地。说时迟那时快,打坐过久的程序猿童鞋三叉神经突然短路,手一哆嗦,无意中使出一招小连续技:cd + 回车,豁!一夜回到解放前……肿么办?还好有cd -。用起来是这样的,效果是刚刚的:zlf@ubuntu:~/gnutls-3.3.12/lib/x509$ cd  //坐上时光穿梭机zlf@ubuntu:~$   ..._cd短路

命令注入绕过小结_php 命令 注入 绕过-程序员宅基地

文章浏览阅读944次。学到的东西,拎出来,总结总结,分享出来,才是完整的学习过程我觉得。一、命令注入官方的解释:即 Command Injection。是指通过提交恶意构造的参数破坏命令语句结构,从而达到执行恶意命令的目的。记得师傅用一句话概括注入的本质:就是把非法的输入当做代码来执行了。二、绕过.号被过滤,无法执行反弹目标机器的IP(例:192.168.1.1)时,将IP转成十进制进行绕过。(172...._php 命令 注入 绕过

job源码分析_new jobconf-程序员宅基地

文章浏览阅读1.4k次。/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * ..._new jobconf

PVE FRP MySQL 端口映射_frp pve-程序员宅基地

文章浏览阅读1.3k次。PVE FRP MySQL 端口映射前言虚拟软件(PVE,VMWare,Docker,VirtualBox)如果用有线连接除宿主机之外的主机均有可能连不上虚拟机里的MySQL,使用Wifi 就100% 能连上目前已知的解决办法是用frp 做虚拟机和宿主机的端口映射,然后其他机器访问宿主机服务端# 创建安装目录mkdir -p /opt/modules# 下载frpcd && wget https://github.com/fatedier/frp/releases/dow_frp pve

联合概率数据互联(JPDA) ----多假设跟踪(MHT)-程序员宅基地

文章浏览阅读3.8w次,点赞36次,收藏237次。联合概率数据关联(Joint Probabilistic Data Association,JPDA) 联合概率数据互联JPDA是数据关联算法之一,它的基本思想是:对应于观测数据落入跟踪门相交区域的情况,这些观测数据可能来源于多个目标。JPDA的目的在于计算观测数据与每一个目标之间的关联概率,且认为所有的有效回波都可能源于每个特定目标,只是它们源于不同目标的概率不同。JPDA算法的..._多假设跟踪

ARKit从入门到精通(1)-ARKit初体验-程序员宅基地

文章浏览阅读10w+次,点赞59次,收藏161次。ARKit从入门到精通(1)-ARKit初体验转载请标注出处:http://blog.csdn.net/u013263917/article/details/72903174,以及版权归属黑马程序员:http://www.itheima.com1.1-AR技术简介增强现实技术(Augmented Reality,简称 AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像、视频、3D模型的技_arkit

随便推点

python逐行写入数据_python整行数据写入excel表格-想问下python3怎么将列表数据逐行写入excel表格呢?...-程序员宅基地

文章浏览阅读546次。如何用python将数据写入excel表格首先win2com模块,在Python 3.1下运下代码即可,随意转载但希望注明:CD-one的实例 注解from win32com.client import DispatchxlApp = Dispatch('Excel.Application')xlApp.Visible = 1#xlApp.Workbooks.Add()#添加工作本#在(1,1)这..._python往excel逐行写入数据

基于springboot的球队训练信息管理系统的设计与实现-程序员宅基地

文章浏览阅读1.6k次,点赞31次,收藏50次。功能对照表的目的是帮助开发团队了解软件的功能状况,及时修复功能缺陷和错误,并提高软件的质量和稳定性。功能编号功能名称功能描述功能状态备注1用户登录用户可以通过提供用户名和密码登录系统正常用户名和密码的验证机制安全性2用户注册用户可以通过提供用户名、密码和电子邮件地址注册新的账户正常无3密码修改用户可以通过提供原密码和新密码修改已有账户的密码正常用户密码的修改操作是否需要提供安全认证4用户信息查看用户可以查看自己的个人信息,如用户名、电子邮件地址、角色等正常无。

Python 复合语句-程序员宅基地

文章浏览阅读886次,点赞15次,收藏26次。匹配语句逻辑流程的概述如下:对目标表达式求值后将结果作为匹配用的目标值。如果目标表达式包含逗号,则使用构建一个元组。目标值将依次与case_block中的每个模式进行匹配。匹配成功或失败的具体规则在下面描述。匹配尝试也可以与模式中的一些或所有的独立名称绑定。准确的模式绑定规则因模式类型而异,具体规定见下文。成功的模式匹配过程中产生的名称绑定将超越所执行的块的范围,可以在匹配语句之后使用。备注在模式匹配失败时,一些子模式可能会成功。不要依赖于失败匹配进行的绑定。

APP兼容性测试_为什么app要测兼容性-程序员宅基地

文章浏览阅读1.1k次。主要测试内部和外部兼容性1)与本地及主流App是否兼容2)与各种设备是否兼容,若有跨系统支持则需要检验是否在个系统下,各种行为是否一致。不同手机屏幕分标率的兼容性不同手机品牌的兼容性..._为什么app要测兼容性

关于串行通信、通信接口、接口连接器、通信协议的理解_通讯器,连接器,串口器的区别-程序员宅基地

文章浏览阅读3.8k次,点赞2次,收藏4次。串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。其只需要少数几条线就可以在系统间交换信息,特别使用于计算机与计算机、计算机与外设之间的远距离通信。通信接口是指中央处理器和标准通信子系统之间的接口。(是否可以理解为对电气特性的定义?)串行接口是一种可以将接受来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接受的串行数据流_通讯器,连接器,串口器的区别

Android面试题精选——再聊Android-Handler机制-2(1),一次关于JVM的面试经历-程序员宅基地

文章浏览阅读583次,点赞29次,收藏25次。写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于Flutter的学习思路及方向,从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的。