当前位置: 代码迷 >> 综合 >> 线程等待 WaitFor...
  详细解决方案

线程等待 WaitFor...

热度:7   发布时间:2024-01-03 15:17:59.0

一:BOOL GetExitCodeThread(HANDLE hThread, LPDWORD lpExitCode);

该函数可以决定一个线程是否还在执行,只要不断的检测返回值就可以判断线程是否结束。但是不断的检测会浪费CPU事件。常说的busy loop就是这种现象。

二:DWORD WaitForSingleObject(HANDLE hHandle, DWORD dwMilliseconds);

hHandle:等待对象的句柄(代表一个核心对象),如线程句柄。
dwMilliseconds:时间间隔,即使对象未激活,时间到了还是会返回
1:此函数返回成功的三个因素:
1)等待的目标(核心对象)变成激发状态,返回WAIT_OBJECT_0;
2)核心对象变成激发状态前,等待时间到了,返回WAIT_TIMEOUT;
3)如果一个拥有MUTEX(互斥器)的线程结束前没有释放MUTEX,则传回WAIT_ABANDONED。

当线程正在执行时,线程对象处于未激活状态。当线程结束时,线程对象就会被激活,函数WaitForSingleObject就会醒来。需要注意的是:醒来未必立即被调动,而只是从休眠态队列排入就绪队列,等待操作系统调度。
HANDLE g_hEvent;
UINT _stdcall ChildFunc(LPVOID);
int main(int argc, char* argv[])
{
    HANDLE hChildThread;
    UINT uId;

    // 创建一个自动重置的事件
    g_hEvent = ::CreateEvent(NULL, FALSE, FALSE, NULL);

    hChildThread = (HANDLE)::_beginthreadex(NULL, 0, ChildFunc, NULL, 0, &uId);

    //用户输入字符后,就会激活时间
    getchar();
    ::SetEvent(g_hEvent);

    // 等待子线程完成工作,激活线程对象
    ::WaitForSingleObject(hChildThread, INFI