需要传递给新线程的任何参数都在CreateThread()的lpParamete中指定。线程函数在它的参数中接收这个32位的值。这个参数可以用作任何目的。函数返回它的退出状态。
函数原型如下:
#include <windows.h> HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, //线程的一些属性 DWORD dwStackSize, //声明线程的堆栈大小 LPTHREAD_START_ROUTINE lpStartAddress, //传入线程执行的函数(函数地址) LPVOID lpParameter, //给线程传入参数 DWORD dwCreationFlags, //创建线程的参数 LPDWORD lpThreadid //表示新建线程的ID号 );
各个参数的作用如下:
lpThreadAttributes:
指向SECURITY_ATTRIBUTES型态的结构的指针。设为NULL使用默认安全性。
dwStackSize:
设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。
lpStartAddress:
指向线程函数的指针,函数名称没有限制,
但是必须以下形式声明:DWORD WINAPI ThreadProc(LPVOID lpParam)。例如我将这个函数名定为DWORD WINAPI ClientThread(LPVOID lpParameter),
lpParameter:
向线程函数传递的参数,是一个void*的指针,不需传递参数时,为NULL。
dwCreationFlags:
线程的标志,可取值如下
(1)CREATE_SUSPENDED:系统创建线程后,该线程处于挂起状态,并不马上执行,直至函数ResumeThread()被调用。
(2)0:线程在被创建后立即开始执行。
(3)STACK_SIZE_PARAM_IS_A_RESERVATION:未指定此标记,使用dwStackSize指定提交的大小。
lpThreadid:
返回所创建线程的ID。如果创建成功则返回线程的句柄,否则返回NULL。 若不想返回线程ID,这个参数设置为为NULL。
返回值:
成功:返回线程句柄
失败:返回NULL,调用GetLastError()获取失败原因。
备注:
(1)CreateThread 是Windows API中再主线程的基础上创建一个新线程。创建成功之后会返回一个hThread的handle,且内核对象的计数加1。
(2)CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。handle仅仅是线程的一个“标识”。
获取线程ID
DWORD WINAPI GetCurrentThreadid(void); 返回获取当前的ID。
关闭线程句柄(引用记数-1)
BOOL CloseHandle(HANDLE hObject);
关闭了一个线程句柄,引用计数-1,表示 我不对这个句柄对应的线程做任何干预(如waitforsingleobject之类),但并没有结束线程。
返回值:
成功:TRUE
失败:FALSE 调用GetLastError()获得失败原因。
注意:如果关闭后再对句柄做任何都无用!
挂起指定的线程
DWORD WINAPI SuspendThread(HANDLE hThread); hThread: 需要挂起的句柄。
恢复被挂起的线程
DWORD WINAPI ResumeThread(HANDLE hThread); hThread: 需要挂起的句柄。
休眠线程的执行
VOID WINAPI Sleep(DWORD dwMilliseconds); dwMilliseconds:毫秒数。
转自:
https://blog.csdn.net/weixin_41794771/article/details/81535183