处理线程的函数

来源:互联网 发布:有关网络语言的作文 编辑:程序博客网 时间:2024/05/16 08:58
CreateThread:原型:HANDLE CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes,DWORD dwStackSize,LPTHREAD_START_ROUTINElpStartAddress,LPVOID lpParameter,DWORD dwCreationFlags,LPDWORD lpThreadId);
参数:lpThreadAttributes:指向SECURITY_ATTRIBUTES型态的结构的指针。在Windows NT中,NULL使用默认安全性,不可以被子线程继承,否则需要定义一个结构体将它的bInheritHandle成员初始化为TRUE
dwStackSize,设置初始栈的大小,以字节为单位,如果为0,那么默认将使用与调用该函数的线程相同的栈空间大小。
lpStartAddress,指向线程函数的指针,形式:@函数名,函数名称没有限制,
lpParameter:向线程函数传递的参数,是一个指向结构的指针,不需传递参数时,为NULL。
dwCreationFlags :线程标志,可取值如下
  (1)CREATE_SUSPENDED(0x00000004):创建一个挂起的线程,
(2)0:表示创建后立即激活。
(3)STACK_SIZE_PARAM_IS_A_RESERVATION(0x00010000):dwStackSize参数指定初始的保留堆栈的大小,否则,dwStackSize指定提交的大小。
lpThreadId:保存新线程的id。


AfxBeginThread函数分为用户界面线程和工作者线程:
界面线程原型  CWinThread* AFXAPI AfxBeginThread(CRuntimeClass* pThreadClass,int nPriority,UINT nStackSize,DWORD dwCreateFlags,LPSECURITY_ATTRIBUTES lpSecurityAttrs)
参数:  参数1是从CWinThread派生的RUNTIME_CLASS类;
        参数2指定线程优先级,如果为0,则与创建该线程的线程相同;
        参数3指定线程的堆栈大小,如果为0,则与创建该线程的线程相同;
        参数4是一个创建标识,如果是CREATE_SUSPENDED,则在悬挂状态创建线程,在线程创建后线程挂起,否则线程在创建后开始线程的执行。
        参数5表示线程的安全属性,NT下有用。


工作者线程的AfxBeginThread原型 CWinThread* AfxBeginThread(AFX_THREADPROC pfnThreadProc,LPVOID lParam,int nPriority = THREAD_PRIORITY_NORMAL,UINT nStackSize = 0,DWORD dwCreateFlags = 0,LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
参数:  pfnThreadProc : 线程的入口函数,声明一定要如下: UINT MyThreadFunction(LPVOID pParam),不能设置为NULL;
       pParam : 传递入线程的参数,注意它的类型为:LPVOID,所以我们可以传递一个结构体入线程.
        nPriority : 线程的优先级,一般设置为 0 .让它和主线程具有共同的优先级.
        nStackSize : 指定新创建的线程的栈的大小.如果为 0,新创建的线程具有和主线程一样的大小的栈
        dwCreateFlags : 指定创建线程以后,线程有怎么样的标志.可以指定两个值:
        CREATE_SUSPENDED : 线程创建以后,会处于挂起状态,直到调用:ResumeThread0 : 创建线程后就开始运行.
        lpSecurityAttrs : 指向一个 SECURITY_ATTRIBUTES 的结构体,用它来标志新创建线程的安全性.如果为 NULL,那么新创建的线程就具有和主线程一样的安全性.


AfxEndThread:原型void   AfxEndThread(UINT  nExitCode,BOOL bDelete = TRUE);
功能:用于终止当前正在执行的线程,必须在当前线程内部调用才能生效。
参数:  nExitCode: 32位的线程的退出码,该退出码由GetExitCodeThread方法获得。
        bDetete: 是否从内存中删除线程对象,默认值为TRUE。


GetExitCodeThread:原型:BOOL GetExitCodeThread( HANDLE hThread, LPDWORD lpExitCode);
功能:获取一个已中止线程的退出代码,
      注意:在Windows NT/2000/XP平台下,句柄必须要有THREAD_QUERY_INFORMATION权限。


TerminateThread:原型BOOL TerminateThread(  HANDLEhThread, DWORDdwExitCode);
功能:在线程外终止一个线程,用于强制终止线程。
参数:  HANDLE hThread:被终止的线程的句柄,为CWinThread指针。
        DWORD dwExitCode:退出码。
注意:避免在new和delete之间执行TerminateThread,否则程序将不能在继续使用new了。


ResumeThread:原型:DWORD WINAPI ResumeThread( __in HANDLE hThread);
功能:恢复挂起的线程    消耗线程挂起的时间计数,直到时间计数为0,则激活线程


CloseHandle:原型:BOOL CloseHandle(HANDLE hObject);
参数        hObject :代表一个已打开对象handle。
返回值        TRUE:执行成功;FALSE:执行失败,可以调用GetLastError()获知失败原因。
功能:关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等。在CreateThread成功之后会返回一个hThread的handle,且内核对象的计数加1,CloseHandle之后,引用计数减1,当变为0时,系统删除内核对象。
若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。


DuplicateHandle:原型:BOOL WINAPI DuplicateHandle(__in    HANDLE hSourceProcessHandle,__in    HANDLE hSourceHandle,__in    HANDLE hTargetProcessHandle,__out   LPHANDLE lpTargetHandle,__in    DWORD dwDesiredAccess,__in    BOOL bInheritHandle,__in    DWORD dwOptions);
参数:hSourceProcessHandle:源进程内核句柄(即负责传递内核对象句柄的进程句柄)
hSourceHandle:要传递的内核对象句柄
hTargetProcessHandle:目标进程内核句柄
lpTargetHandle:接收内核对象句柄的地址(先随便声明一个HANDLE)
dwDesiredAccess:TargetHandle句柄使用何种访问掩码(这个掩码是在句柄表中的一项)
bInheritHandle:是否拥有继承
dwOptions:当设DUPLICATE_SAME_ACCESS时,表示于源的内核对象所有标志一样,此时wDesiredAccess可标志为0,当设DUPLICATE_CLOSE_SOURCE时,传输完后,关闭源中的内核对象句柄此函数能否成功调用还要看你是否有足够的权限去操作目标进程通常目标进程的内核句柄是利用OpenProcess()得到的HANDLE WINAPI
OpenProcess(__in   DWORD dwDesiredAccess,__in   BOOL bInheritHandle,__in   DWORD dwProcessId);其中dwDesiredAccess:决定你拥有该进程的操作权限,如果要成功用到则要填PROCESS_ALL_ACCESS或PROCESS_DUP_HANDLE,bInheritHandle:是否可继承,dwProcessId:这个ID可在资源管理器中找到,当然,我不提倡在哪里得到,或者你可以通过进程间通信的方法把PID从目标进程传给源进程
若DuplicateHandle()能成功执行,则利用进程通信把句柄值TargetHandle传给目标进程,让他知道利用该句柄使用内核对象
注意:不要试图在源进程中利用CloseHandle()关闭TargetHandle,因为这个TargetHandle句柄值并不属于源进程的句柄表中的,若错误关闭了,会产生不可预料的结果


_beginthreadex():原型uintptr_t _beginthreadex(void *secAttr, unsigned stackSize,unsigned (__stdcall *threadFunc)(void *),void *param, unsigned flags,unsigned *threadID);///////就是在使用Visual C++时候用来替换CreateThread创建函数::会导致内存泄漏
参数 secAttr是一个用来描述线程安全性属性的指针,如果为空,则会使用默认的安全描述符
      stackSize是用来指定的线程栈的大小,如果为零,则和主线程栈的大小一样大
      (__stdcall *threadFunc)(void *)    制定了线程函数的地址,在功能上等价于CreateThread()的线程函数的原型,但是它使用了不同的类型名称。想要传递给新线程的任何参数都在param参数中指定。
      flags:确定线程的执行状态,如果为零表示创建就立即执行。如果是CREATE_SUSPEMDED表示将创建的线程挂起;


_endthreadex()  原型:void _endthreadex(unsigned status);////////就是用来使用Visual C++时候用来替换EndThread()结束线程函数::会导致内存泄漏
功能:就行exitThread那样,停止线程并返回status中指定的退出代码
原创粉丝点击