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);
?}
编译运行,设置断点,可以查看运行情况。