一: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
详细解决方案
线程等待 WaitFor...
热度:7 发布时间:2024-01-03 15:17:59.0