WaitForSingleObject的用法 标点符号的正确用法

2. WaitForSingleObject
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);

}

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

  

爱华网本文地址 » http://www.413yy.cn/a/25101011/103548.html

更多阅读

香水使用方法如何正确使用香水 擦香水的正确方法

香水使用方法如何正确使用香水——简介现在都市生活的人,出门的时候,在身上喷点香水以给别人留下好点的印象,但是你知道香水的正确使用方法吗?香水使用方法如何正确使用香水——方法/步骤香水使用方法如何正确使用香水 1、香水如何使用

避孕套的正确使用方法图解 如何使用避孕套图解

避孕套的正确使用方法(图解)——简介正确的使用避孕套才不会导致避孕失败避孕套的正确使用方法(图解)——方法/步骤避孕套的正确使用方法(图解) 1、选择适合自己的避孕套,不能过大或过小。打开包装向避孕套内吹气,如果漏气就说明这个套套破

睫毛膏的正确用法 睫毛膏如何使用

  睫毛膏对于很多女孩子来说其实并不陌生,但是大家真的知道睫毛膏的正确用法吗,如何使用睫毛膏才能让自己的睫毛更翘、更卷,而且看起来不会显得很僵硬呢,如果你还不懂那就来一起学习一下睫毛膏的正确用法吧。睫毛膏的正确用法——工

睡眠面膜:蜂胶睡美睡眠面膜的正确使用方法

睡眠面膜:蜂胶睡美睡眠面膜的正确使用方法——简介?为了保持美白肌肤,爱美MM们一天到晚都在做着护肤工作,夜间也会使用睡眠面膜来塑造自己的美;蜂胶睡美睡眠面膜进入人们的视线后为爱美人士夜间护理带来了很大的方便,不少朋友也因为肌肤

无线路由器的正确使用方法 眼霜的正确使用方法

无线路由器的正确使用方法——简介现代是互联网高速发展的时代,随着互联网的普及,很多人的家里都装上了台式电脑,然而,电脑需要联网才能正常使用,这其中就提到了电脑要用路由器来共享上网,这对新手来说,是一个难题,但这对小编来说,是非常简单

声明:《WaitForSingleObject的用法 标点符号的正确用法》为网友君子动手不动口分享!如侵犯到您的合法权益请联系我们删除