WaitForSingleObject函数

WaitForSingleObject函数

VC声明

DWORD WaitForSingleObject(

HANDLE hHandle,

DWORD dwMilliseconds

);

VB声明

Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long

编辑本段说明

DWORD WINAPI WaitForSingleObject(

__in  HANDLE hHandle,

__in  DWORD dwMilliseconds

);

参数

hHandle [in]对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。

当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。该句柄必须具有 SYNCHRONIZE 访问权限。

dwMilliseconds [in]定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle 标记的对象被触发,或者时间到了。如果dwMilliseconds 为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds 为INFINITE,对象被触发信号后,函数才会返回。

返回值

执行成功,返回值指示出引发函数返回的事件。它可能为以下值:

   

WAIT_ABANDONED0x00000080L

The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling
thread and the mutex state is set to nonsignaled.

If the mutex was protecting persistent state information, you should check it for consistency.


WAIT_OBJECT_00x00000000L

The state of the specified object is signaled.

WAIT_TIMEOUT0x00000102L

The time-out interval elapsed, and the object's state is nonsignaled.

WAIT_FAILED(DWORD)0xFFFFFFFF

The function has failed. To get extended error information, call GetLastError.

WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。参数dwMilliseconds有两个具有特殊意义的值:0和INFINITE。若为0,则该函数立即返回;若为INFINITE,则线程一直被挂起,直到hHandle所指向的对象变为有信号状态时为止。

返回值:

WAIT_ABANDONED 0x00000080:当hHandle为mutex时,如果拥有mutex的线程在结束时没有释放核心对象会引发此返回值。

WAIT_OBJECT_0 0x00000000 :核心对象已被激活

WAIT_TIMEOUT 0x00000102:等待超时

WAIT_FAILED 0xFFFFFFFF :出现错误,可通过GetLastError得到错误代码

在这里举个例子:

先创建一个全局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执行一次,当设置事件为有信号状态时,线程就执行完毕了。

时间: 2024-12-04 19:29:55

WaitForSingleObject函数的相关文章

WaitForSingleObject

用户模式的线程同步机制效率高,如果需要考虑线程同步问题,应该首先考虑用户模式的线程同步方法. 但是,用户模式的线程同步有限制,对于多个进程之间的线程同步,用户模式的线程同步方法无能为力.这时,只能考虑使用内核模式.   Windows提供了许多内核对象来实现线程的同步.对于线程同步而言,这些内核对象有两个非常重要的状态:"已通知"状态,"未通知"状态(也有翻译为:受信状态,未受信状态).Windows提供了几种内核对象可以处于已通知状态和未通知状态:进程.线程.作业

Delete yourself(C#)

一种巧妙的删除程序自己的方法 关键字 一种巧妙的删除程序自己的方法 大家都知道,一般的程序运行的时候,可执行文件本身是被操作系统保护的,不能用改写的方式访问,更别提在本身还在运行的时侯删除自己了.在Lu0的主页上看到一种UNDOCUMENT的方法,通过改变系统底层的文件访问模式实现删除自己,那是实在功夫.我看 了很是佩服.但是有没有一种用在MSDN上就能查到的函数实现呢?有!Jeffrey Richter给我们做了一个范例: DeleteMe.CPP Module name: DeleteMe.

汇编教程之事件对象

本课中我们将要学习事件对象以及如何在多线程编程中如何使用同步对象. 理论: 上一课中我们演示了如何用WINDOWS消息在不同的线程之间进行通讯.另外的两种,即:使用全局变量和事件对象,将在本课中讲解. 事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于"开"状态,我们称其为"有信号"否则称为"无信号".您可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是"无信号"就让该线程睡眠,这样该线程占用的

事件对象在多线程编程中的应用

本课中我们将要学习事件对象以及如何在多线程编程中如何使用同步对象. 理论:上一课中我们演示了如何用WINDOWS消息在不同的线程之间进行通讯.另外的两种,即:使用全局变量和事件对象,将在本课中讲解. 事件对象就像一个开关:它只有两种状态---开和关.当一个事件处于"开"状态,我们称其为"有信号"否则称为"无信号".您可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是"无信号"就让该线程睡眠,这样该线程占用的C

临界区的互斥控制

本文配套源码 一.前言 我正在研究线程的通讯,无奈有关这方面的资料实在太少,没办法我只好去啃MSDN,但是MSDN好像说得也不太清楚.所以那我就写了这么一个例子,以望对学习多线程编程起到引玉抛砖的作用.有个易懂的例子学起来总是容易很多.近来我正在复习那几个排序算法,于是就把这些算法写到了这里来作为线程的例子.同时也对几个通用的排序算法思想作了一些说明. 这个例子利用多线程使用不同的排序算法对数据进行排序,每一个线程使用不同的算法.主线程里使用快速排序QuickSort,其他四个算法分别建立四个子

多线程编程(19)

在前面例子的基础上, 探讨新问题. 假如我们想让几个线程(例子中是 3 个)依次执行, 我们可以使用临界区.信号.互斥等手段; 但下面第一个例子什么同步工具都没用, 也达到了目的; 方法是: 让前一个线程在结束前顺便启动下一个线程. 第二个例子使用了互斥对象配合 WaitForSingleObject 函数, 也达到相似的目的. 效果图(两个例子的效果图差不多, 但第二个例子的执行顺序不好保证): 第一个例子的代码文件: unit Unit1; interface uses Windows, M

多线程编程(10)

原理分析: 互斥对象是系统内核对象, 各线程都可以拥有它, 谁拥有谁就能执行; 执行完毕, 用 ReleaseMutex 函数释放拥有权, 以让其他等待的线程使用. 其他线程可用 WaitForSingleObject 函数排队等候(等候也可以理解为排队申请). 使用过程: var hMutex: THandle; {应该先声明一个全局的互斥句柄} CreateMutex {建立一个互斥对象} WaitForSingleObject {用等待函数排队等候} ReleaseMutex {释放拥有权

线程性能

随着多核处理器变得越来越常见,软件开发人员就需要构建多线程应用程序 ,从而利用更多的处理能力来实现更高的性能.借助并行线程的强大功能,您可 以将整个工作划分为多项单独的任务,并以并行模式执行这些任务. 但是,线程经常需要相互通信才能完成任务:而且根据算法或数据访问的要 求,有时还需要同步线程的行为.例如,应该以互斥的方式授予线程对同一数据 的同时写访问权限,以避免数据损坏. 同步操作通常是通过使用共享的同步对象来完成的.对于获得该对象的线程 ,将授予其对敏感代码或数据的共享或独占访问权限.当不再

线程及 进程间的通信问题! .

一个很好的编程随想的博客http://program-think.blogspot.com/2009/03/producer-consumer-pattern-0-overview.html 架构设计:生产者/消费者模式[0]:概述  1.如何确定数据单元2.队列缓冲区3.环形缓冲区4.双缓冲区 生产 消费 2010-06-01 10:13   #include <boost/thread/thread.hpp> #include <boost/thread/mutex.hpp>