相关API函数介绍:
函数:HANDLE OpenThread( DWORD dwDesiredAccess,BOOL bInheritHandle,DWORD dwThreadId)
作用:利用线程ID获得线程句柄
dwDesiredAcess:打开进程欲获得大的权限,一般PROCESS_ALL_ACCESS
bInheritHandle:获得的句柄是否可以继承,一般不:FALSE
dwThreadId:线程的ID
函数:DWORD SuspendThread(HANDLE)
作用:暂停线程
参数是要暂停线程的句柄
函数:DWORD ResumeThread(HANDLE)
作用:恢复线程
参数是要暂停线程的句柄
函数:HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes, DWORD dwStackSize,
LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter,
DWORD dwCreationFlags,
LPDWORD lpThreadId
);
作用:创建线程(创建不成功返回NULL)
lpThreadAttributes:创建线程的安全属性,一般为NULL(默认)
dwStackSize:指定线程使用缺省的堆栈大小,如果为NULL,则与进程主线程相同
lpStartAddress:指定线程函数,线程从该函数的入口处开始运行,函数返回意味着线程的结束
函数的定义形式如下:
DWORD WINAPI ThreadProc( LPVOID lpParameter);该参数在CreateThread中给出,函数名称随便
lpParameter:表示传给线程函数的一个任意类型的指针,可以是多个参数通过结构体一次性传入
dwCreationFlags:创建线程后线程的状态,如果是0,则立即执行;如果是CREATE_SUSPENDED,则线程处于暂停状态,等需要执行的时候使用ResumeThread函数恢复执行
lpThreadId:返回线程的ID(指针)
函数:DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
)
作用:主线程的等待函数(只能等待一个线程)
hHandle:要等待对象的线程句柄
dwMilliseconds:指定等待超时的毫秒数,立即返回为0;无限等待为INFINITE
函数失败,返回WAIT_FAILEDD;等待对象编程激发态,返回WAIT_OBJECT_0;如果等待对象编程激发态之前,等待时间结束了,则返回WAIT_TIMEOUT
函数:DWORD WaitForMultipleObjects(
DWORD nCount,
CONST HANDLE *lpHandles,
BOOL fWaitAll,
DWORD dwMilliseconds
)
作用:可以等待多个线程
nCount:让函数等待的线程个数,范围在1--MAXIMUM_WAIT_OBJECTS之间
lpHandles:指向等待线程句柄的数组指针
fWaitALl:TRUE:等待全部线程结束
dwMilliseconds:用法同WaitForSingleObject中
其中暂停和等待函数就不必介绍使用,很简单。下边是一个简单例子,解释在其中:
# include <iostream>
# include <Windows.h>
# include <tchar.h>
# include <vector>
using namespace std;
DWORD ThreadProc_1() //线程函数_1
{
cout << "It's Thread_1 now." << endl;
return 0;
}
DWORD ThreadProc_2() //线程函数_2
{
cout << "It's Thread_2 now." << endl;
return 0;
}
int main()
{
vector<HANDLE>HANDLES; //句柄数组
DWORD ThreadId_1 = 0; //定义线程_1的ID
//创建线程1
HANDLE hThread_1 = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)ThreadProc_1,NULL,0,&ThreadId_1);
DWORD ThreadId_2 = 0; //定义线程_2的ID
//创建线程2
HANDLE hThread_2 = CreateThread(NULL,NULL, (LPTHREAD_START_ROUTINE)ThreadProc_2,NULL,0,&ThreadId_2);
//判断句柄是否有效
if (hThread_1 == INVALID_HANDLE_VALUE||hThread_1==INVALID_HANDLE_VALUE)
{
cout << "Create Thread Failed!" << endl;
}
//添加句柄到数组
HANDLES.push_back(hThread_1);
HANDLES.push_back(hThread_2);
//WaitforSingleObject这是等待一个线程,主线程的执行需要等待其他线程的完成,第一个参数是句柄
//DWORD Info=WaitForSingleObject(hThread_1, INFINITE);
//WaitForMultipleObjects等待多个线程
DWORD Info = WaitForMultipleObjects(2,&HANDLES[0],TRUE,INFINITE);
//如果等待失败
if (Info == WAIT_FAILED)
{
cout << "Wait Failed!" << endl;
}
cout << "Main function now." << endl;
system("pause");
return 0;
}
结果如下: