DWORD WINAPI WaitForSingleObject(
_In_ HANDLE hHandle,
_In_ DWORD dwMilliseconds
);
等待线程执行
- hHandle-线程句柄
- dwMilliseconds-等待毫秒数,设置为INFINITE,则为无线等待,有点join的意思
返回参数
WAIT_ABANDONED | |
WAIT_OBJECT_0 | 线程退出 |
WAIT_TIMEOUT | 等待时间到以后线程还未退出 |
WAIT_FAILED | 函数执行失败 |
VOID WINAPI ExitThread(
_In_ DWORD dwExitCode
);
用于线程函数内部退出线程
- dwExitCode-退出码,可自定义
BOOL WINAPI TerminateThread(
_Inout_ HANDLE hThread,
_In_ DWORD dwExitCode
);
终止指定线程
- hThread-要退出线程的句柄
- dwExitCode-退出码,可自定义
BOOL WINAPI GetExitCodeThread(
_In_ HANDLE hThread,
_Out_ LPDWORD lpExitCode
);
获取线程退出时的退出码
- hThread-要获取退出码的线程
- lpExitCode-退出码,传入地址
例程:
阻塞等待,线程自己主动退出,主线程获取退出码:
// windowsAPI等待线程运行.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI threadfun(void* lpParameter)
{
for (int i = 1; i <= 10; ++i)
{
cout << "第" << i << "次打印Hello" << endl;
Sleep(1000);
if (i == 5)
ExitThread(321);
}
return 0;
}
int main()
{
cout << "主线程开始" << endl;
HANDLE hThread = CreateThread(NULL,0,threadfun,NULL,0,NULL);
DWORD exitCode = 0;
GetExitCodeThread(hThread, &exitCode);
if (exitCode == STILL_ACTIVE)
cout << "子线程还未退出" << endl;
WaitForSingleObject(hThread,INFINITE);
GetExitCodeThread(hThread, &exitCode);
if (exitCode == STILL_ACTIVE)
cout << "子线程还未退出" << endl;
else
cout << "子线程退出码" << exitCode << endl;
cout << "主线程结束" << endl;
return 0;
}
主线程指定线程退出并获取退出码:
// windowsAPI等待线程运行.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI threadfun(void* lpParameter)
{
for (int i = 1; i <= 10; ++i)
{
cout << "第" << i << "次打印Hello" << endl;
Sleep(1000);
}
return 0;
}
int main()
{
cout << "主线程开始" << endl;
HANDLE hThread = CreateThread(NULL,0,threadfun,NULL,0,NULL);
DWORD exitCode = 0;
WaitForSingleObject(hThread, 3000);//等待3秒,然后执行终止函数
TerminateThread(hThread, 654);
GetExitCodeThread(hThread, &exitCode);//立即判断要终止线程的状态
if (exitCode == STILL_ACTIVE)
cout << "子线程还未退出" << endl;
WaitForSingleObject(hThread,INFINITE);//等待终止完成获取退出码
GetExitCodeThread(hThread, &exitCode);
if (exitCode == STILL_ACTIVE)
cout << "子线程还未退出" << endl;
else
cout << "子线程退出码" << exitCode << endl;
cout << "主线程结束" << endl;
return 0;
}