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);
}
编译运行,设置断点,可以查看运行情况。
相关推荐
在新的线程中,使用WaitForSingleObject函数等待进程的结束,直到进程结束时,输出“进程已关闭”的信息。 WaitForSingleObject函数可以广泛应用于多线程编程中,例如等待线程的结束、等待互斥对象的释放、等待信号...
#### WaitForSingleObject函数 `WaitForSingleObject`函数用于等待指定对象变为发信号状态。 ##### 函数原型 ```c++ DWORD WaitForSingleObject( HANDLE hObject, // 要等待的对象句柄 DWORD dwMilliseconds // ...
3. **使用WaitForSingleObject**:在消费者线程中,调用`WaitForSingleObject`函数,传入`CEvent`对象的句柄,以等待事件被信号化。如果事件未被信号化,`WaitForSingleObject`将挂起当前线程,直到事件被设置。 4....
例如,一个线程可能会创建一个信号,并使用`SetEvent`函数将其设置为信号化状态,以便其他线程通过调用`WaitForSingleObject`来唤醒。 多线程编程中,信号的使用有助于解决资源竞争问题,确保数据一致性,防止死锁...
在Windows API中,`WaitForSingleObject`是一个关键的同步函数,用于等待某个对象的状态变化。这个函数在创建多线程应用时非常有用,可以避免竞态条件和死锁等问题。现在我们来深入探讨`WaitForSingleObject`以及与...
`WaitForSingleObject`和`CreateThread`是Windows API中的两个重要函数,它们在处理线程同步和控制流程方面发挥着重要作用。 `CreateThread`函数用于在进程中创建一个新的线程。这个函数允许程序员并行执行代码,...
在Windows环境下,`WaitForSingleObject`函数是实现这些功能的关键工具之一。接下来,我们将深入探讨这三个知识点以及它们如何与`WaitForSingleObject`相结合。 首先,**多线程**是指在单个进程中执行多个独立的...
此时可以通过 `OpenProcess` 函数获取进程句柄,进而使用 `WaitForSingleObject` 监控其状态变化。 ```cpp // 获取进程ID DWORD dwPID = GetProcessIdByName("notepad.exe"); // 打开进程 HANDLE hProcess = ...
`WaitForSingleObject`是一个Windows API函数,用于挂起调用线程直到指定的对象变为信号状态或超时时间结束。它主要用于线程间的同步,特别是当需要等待某个特定条件(如资源可用)时。 #### 限制与不足 虽然用户...
Wait 函数包括 WaitForSingleObject 和 WaitForMultipleObjects 两个 API 函数。 WaitForSingleObject 函数用于等待一个对象,等待的对象可以是变化通知、控制台输入、事件、作业、互斥信号量、进程、计数信号量、...
5. **等待结果**:如果需要获取函数执行结果,可以使用`WaitForSingleObject`等待线程结束,并通过`GetExitCodeThread`获取返回值。 在提供的压缩包中,"演示DLL.dll"可能是包含我们需要调用函数的DLL库,"XX辅助.e...
8. **多线程编程**:VB支持通过API函数进行多线程编程,如`CreateThread`用于创建新的线程,`WaitForSingleObject`用于等待线程结束。 9. **图形绘制**:API中的GDI(Graphics Device Interface)函数可用于高级...
7. **多线程与进程控制**:VB API也提供了多线程和进程控制的函数,如`CreateThread`创建新线程,`CreateProcess`启动新进程,`WaitForSingleObject`则用于等待线程或进程结束。 8. **错误处理**:通过API,VB可以...
以下是一个简单的`CreateProcess`函数使用示例,用于启动记事本: ```cpp STARTUPINFO si; PROCESS_INFORMATION pi; ZeroMemory(&si, sizeof(si)); si.cb = sizeof(si); ZeroMemory(&pi, sizeof(pi)); // 创建...
6. **进程和线程管理**:`CreateProcess`用于启动新的进程,`CreateThread`创建新线程,`WaitForSingleObject`用于线程同步,这些API函数让VB程序能进行多任务处理。 7. **注册表操作**:API函数如`RegCreateKeyEx`...
本手册主要涵盖Windows和Unix/Linux环境下的C++函数使用,旨在为开发者提供详尽的帮助。 一、C++函数基础 C++函数是代码组织的基本单元,允许将特定任务封装在一个可重复使用的模块中。函数可以接受输入参数并返回...
- **线程创建与管理**:如`CreateThread()`、`WaitForSingleObject()`等函数用于线程的创建和同步控制。 - **互斥量和信号量**:如`CreateMutex()`、`CreateSemaphore()`等函数用于线程间的同步。 6. **Windows ...
6. **进程和线程**:创建、管理和同步进程和线程的函数,如CreateProcess、CreateThread、WaitForSingleObject和ExitThread。 7. **系统信息**:获取关于系统配置和状态的信息,如GetSystemMetrics、GetVersion和...
7. **CreateMutex** 和 **WaitForSingleObject**:线程同步函数,确保多线程环境中的资源安全共享。 8. **GetVersionEx**:获取Windows操作系统版本信息,这对于兼容性检查和版本控制很重要。 9. **RegCreateKeyEx**...