C++ 多线程: WaitForSingleObject(m_hEvent,INFINITE) ;

WaitForSingleObject(m_hEvent,INFINITE) ;

WaitForSingleObject(m_hEvent, INFINITE) 函數用於停止一個指定的執行緒,直到有信號量或信號通知接收。

m_hEvent 是一個句柄,指向一個事件對象,它可以是由 CreateEvent、OpenEvent 或其他函數創建的。

INFINITE 常量定義為 0xFFFFFFFF,表示無限等待。也就是說,執行緒將一直等待直到有信號量或信號通知接收,並且不會超時返回。

簡而言之,WaitForSingleObject(m_hEvent, INFINITE) 函數讓當前執行緒暫停,直到有信號量或信號通知接收為止


如何使用? 

使用 WaitForSingleObject(m_hEvent, INFINITE) 函數的基本步驟如下:

  1. 在執行緒中創建或打開事件對象。可以使用 CreateEvent、OpenEvent 或其他函數創建或打開事件對象。例如:                                                                                                          HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, TEXT("MyEvent"));
  2. 在執行緒中調用 WaitForSingleObject(hEvent, INFINITE) 函數。例如:
  3. WaitForSingleObject(hEvent, INFINITE);
  4. 在另一個執行緒或程序中發送信號量或信號通知給事件對象。可以使用 SetEvent、PulseEvent 或其他函數發送信號量或信號通知。例如:
  5. SetEvent(hEvent);
  6. 在第 3 步中發送信號量或信號通知後,WaitForSingleObject(hEvent, INFINITE) 函數將返回,執行緒將恢復執行。

注意:請務必在不再使用事件對象時記得關閉它。例如:

CloseHandle(hEvent);


简单范例:

#include <windows.h>
#include <iostream>

using namespace std;

HANDLE hEvent;

// 執行緒函數
DWORD WINAPI ThreadFunc(LPVOID lpParam)
{
    cout << "Thread started. Waiting for event..." << endl;
    // 等待事件
    WaitForSingleObject(hEvent, INFINITE);

    cout << "Event received. Exiting thread..." << endl;

    return 0;
}

int main()
{
    // 創建事件
    hEvent = CreateEvent(NULL, TRUE, FALSE, TEXT("MyEvent"));
    // 創建執行緒
    HANDLE hThread = CreateThread(NULL, 0, ThreadFunc, NULL, 0, NULL);

    cout << "Press Enter to send event..." << endl;
    cin.get();

    // 發送事件
    SetEvent(hEvent);

    // 等待執行緒結束
    WaitForSingleObject(hThread, INFINITE);

    // 關閉事件和執行緒句柄
    CloseHandle(hEvent);
    CloseHandle(hThread);

    return 0;
}

執行結果如下:

Press Enter to send event...
Thread started. Waiting for event...
Event received. Exiting thread...

在上面的範例中,主程序創建了一個事件對象,並創建了一個執行緒。在執行緒中,調用了 WaitForSingleObject(hEvent, INFINITE) 函數,執行緒暫停執行,等待事件。在主程序中,使用 SetEvent(hEvent) 函数發送事件,執行緒恢復執行,然後結束。


总结: 

在使用 WaitForSingleObject(m_hEvent, INFINITE) 函數時,還有一些需要注意的地方。

  • 事件對象必須先創建或打開,才能使用 WaitForSingleObject 函數等待。
  • 在發送信號量或信號通知時,必須確保事件對象已被打開。
  • 如果執行緒需要在多個事件對象之中進行等待,可以使用 WaitForMultipleObjects 函數。
  • 如果需要在超時指定的時間內等待,可以使用 WaitForSingleObject(m_hEvent, dwMilliseconds) 函數。其中 dwMilliseconds 是等待的毫秒數。
  • 如果執行緒需要等待的事件對象並不存在,WaitForSingleObject 函數將返回 WAIT_FAILED,並設置錯誤碼為 ERROR_INVALID_HANDLE。
  • 如果需要等待的事件對象已經被關閉,WaitForSingleObject 函數將返回 WAIT_ABANDONED,並設置錯誤碼為 ERROR_INVALID_HANDLE。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值