WaitForSingleObject的用法

WaitForSingleObject的用法                                      

 

1.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);
}

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

 

转载于:https://www.cnblogs.com/andyhere/archive/2008/10/20/1314803.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/276773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

pom.xml里发布和下载包

1.下载包 在<project>标签中 <repositories><repository><id>nexus</id><url>http://10.39.93.105:8081/repository/maven-public/</url><releases><enabled>true</enabled></releases><snapshots>&l…

智能云改-docker云迁移实战

本次安装的linux版本是centos7.4&#xff0c;docker安装不依赖任何环境&#xff0c;但是必须要连接网络&#xff0c;满足这一点就可以进行docker安装了。 一、安装&#xff1a; 1.删除就版本的docker输入命令&#xff1a;yum -y remove docker \docker-common \docker-selinux …

python词频统计代码_python统计词频

一、程序分析 &#xff08;1&#xff09;将文件读入缓冲区&#xff08;dst指文本文件存放路径&#xff0c;设置成形参&#xff0c;也可以不设&#xff0c;具体到函数里设置&#xff09; def process_file(dst): # 读文件到缓冲区try: # 打开文件 txtopen(dst,"r") ex…

关于wpf,datagrid,双向数据绑定用法解决方案

参考&#xff1a;http://www.myexception.cn/c-sharp/1446457.html 核心内容&#xff0c;在绑定数据的地方添加双向绑定&#xff1a; {Binding BB, ModeTwoWay,UpdateSourceTriggerPropertyChanged} 转载于:https://www.cnblogs.com/Mindy-hym/p/11431069.html

部署zookeeper分布式节点

用2台服务器&#xff0c;低资源&#xff0c;部署3个zookeeper分布式节点&#xff1a; 1.准备环境系统已经配置好了JAVA环境&#xff1b;下载某个版本的zookeeper压缩包&#xff0c;下载链接&#xff1a;http://apache.claz.org/zookeeper/zookeeper-3.5.3-beta/zookeeper-3.5.3…

Oracle的resouce、unlimited tablespace 及如何把数据导入不同的表空间

resouce是角色&#xff0c;unlimited tablespace是权限。 很多人在进行数据迁移时&#xff0c;希望把数据导入不同于原系统的表空间&#xff0c;在导入之后却往往发现&#xff0c;数据被导入了原表空间。本例举例说明解决这个问题:1.如果缺省的用户具有DBA权限那么导入时会按照…

MySQL导入导出远程访问命令

1.导出整个数据库mysqldump -u 用户名 -p 数据库名 > 导出的文件名mysqldump -u wcnc -p smgp_apps_wcnc > wcnc.sql2.导出一个表mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名mysqldump -u wcnc -p smgp_apps_wcnc users> wcnc_users.sql3.导出一个数据库结…

.net开发是做什么的_软件开发是什么, 该怎么做?

软件开发是什么, 该怎么做&#xff1f;1 引子关于什么是软件开发存在很多观点&#xff0c;有的认为软件开发即服务&#xff0c;有的认为软件开发即产品&#xff0c;有的认为软件开发即平台&#xff0c;这些观点各有各的侧重点。这篇文章我们来学习和探讨一下软件开发。2 软件…

虚拟软驱影像文件制作程序下载路径:http://download.csdn.net/source/738137

通过这个程序&#xff0c;可制作一个在虚拟机上运行的Hello China启动软盘&#xff0c;而无需你的计算机具备物理软驱。 If you have not CSDN account or you very care the 3 points will be omitted if you download,please send mail to garryxinyahoo.com.cn, I will send…

css3属性

css3属性 transform动画 transform-origin&#xff1a;设置不动点&#xff0c;以这个点位移transform&#xff1a;translate(x,y):自身偏移量transform:scale(x,y)&#xff1a;缩放&#xff0c;当为负数的时候可以实现反转元素transform&#xff1a;roate&#xff08;xdeg&…

使用HTML5、CSS3和jQuery增强网站用户体验

记得几年前如果你需要添加一些互动元素到你的网站中用来改善用户体验&#xff1f;是不是立刻就想到了flash实现&#xff1f;这彷佛年代久远的事了。使用现在最流行的Web技术HTML5&#xff0c;CSS3和jQuery&#xff0c;同样也可以实现类似的用户体验。而且使用这些特性将会比使用…

python中loop函数_python + Django 的forloop功能试验讲解

一、forloop功能详解记录 遇到一个问题困扰了我好久&#xff0c;结果还是知识盲区造成的。下边记录一下。 通过return forloop可以返回前端循环中的索引值 二、forloop大概功能 forloop是Django模板中一个功能&#xff0c;主要是可以计算循环的对象的索引值&#xff08;大白话大…

帆软报表(finereport)JS实现cpt中详细单元格刷新

1.刷新固定单元格 setInterval(function(){ //获取第二行第 5 列 E2 单元格对象var _changeCell $("tr[tridx1]","div.content-container").children().eq(7);//获取 H2 单元格值var _changeVal _changeCell.text();//给表格赋值 if(_changeVal"…

[导入]源代码版本控制(二)

在VS6.0时代&#xff0c;VSS的版本是6.0&#xff0c;现在VS的版本都到2008了&#xff0c;VSS的版本目前是2005&#xff0c;这回以2005为例。安装就免了。数据库的创建&#xff1a;如果要在局域网内共享这个数据库&#xff0c;那还需要将刚才存放数据库的目录共享出去。为数据库…

javascript 控制弹出窗口

前言:经常上网的朋友可能会到过这样一些网站&#xff0c;一进入首页立刻会弹出一个窗口&#xff0c;或者按一个连接或按钮弹出&#xff0c;通常在这个窗口里会显示一些注意事项、版权信息 、警告、欢迎光顾之类的话或者作者想要特别提示的信息。其实制作这样的页面效果非常的容…

苏宁的Node.js实践:不低于Java的渲染性能、安全稳定迭代快

前端 Node.js 的使用场景大多集中在前端工具上&#xff0c;当前的前端主要把它定位为辅助。苏宁易购使用 Node.js 作为前后端分离的主要手段&#xff0c;经历了从技术引进到全面开花&#xff0c;从边缘功能到核心业务&#xff0c;从纷乱到稳定的过程。同时 Node.js 作为新引入的…

wpf: DataGridTextColumn 数字格式显示,编辑时取消格式(StringFormat)

参考&#xff1a;Format values in a Datagrid 参考&#xff1a;Remove stringFormat while editing cell in datagrid 使用 DataGridTemplateColumn 实现&#xff1a; <DataGridTemplateColumn Header"Cot (k€)"><DataGridTemplateColumn.CellTemplate&g…

MVP群聊某美国公司的应聘试题(压死九个还是一个)

某美国公司的应聘试题&#xff08;压死九个还是一个&#xff09;&#xff0c;测试你的管理方式有二条铁轨&#xff0c;一条新的&#xff0c;一条旧的。有了新铁轨后&#xff0c;旧铁轨不再有火车通过。有一天有十个小孩到铁轨上玩耍&#xff0c;九个小孩在新铁轨上玩&#xff0…

JS的常用正则表达式 验证密码

JS的正则表达式强&#xff1a;字母数字特殊字符 ^(?![a-zA-z]$)(?!\d$)(?![!#$%^&*]$)(?![a-zA-z\d]$)(?![a-zA-z!#$%^&*]$)(?![\d!#$%^&*]$)[a-zA-Z\d!#$%^&*]$中&#xff1a;字母数字&#xff0c;字母特殊字符&#xff0c;数字特殊字符^(?![a-zA-z]$)…

微软宣布开源WPF、WinForms和WinUI

在微软Connect 2018大会上&#xff0c;微软发布了.NET Core 3.0的第一个预览版。同时&#xff0c;微软还宣布&#xff0c;他们将WPF、Windows Forms&#xff08;WinForms&#xff09;和WinUI作为开源项目托管在GitHub上。它们都是基于MIT许可发行&#xff0c;开发人员可以在自己…