创建线程

基于windows操作系统,可以采用如下函数创建线程,以前的代码是不准备去翻了,立此备忘而已...

1、windows API CreateThread;

     

HANDLE CreateThread(

PSECURITY_ATTRIBUTES psa, DWORD cbStack,

PTHREAD_START_ROUTINE pfnStartAddr, PVOID pvParam,

DWORD fdwCreate, PDWORD pdwThreadID);

psa参数:是指向PSECURITY_ATTRIBUTES结构的指针。如果希望所有的子进程能够继承该线程对象的句柄,必须设定一个PSECURITY_ATTRIBUTES结构

cbStack参数:用于设定线程线程堆栈的大小。默认值是 1 MB。

pfnStartAddr参数:用于指定新线执行的程线程函数的地址,其实就一回调函数。

pvParam参数:CreateThread使用该参数不做别的事情,只是在线程启动执行时将该参数传递给线程函数。该参数提供了一个将初始化值传递给线程函数的手段。该初始化数据既可以是数字值,也可以是指向包含其他信息的一个数据结构的指针。

fdwCreate参数:可以设定用于控制创建线程的其他标志。该参数值为0时线程创建后可以立即进行调度。是 CREATE_SUSPENDED,系统暂停该线程的运行,使得应用程序在执行任何代码之前修改线程的某些属性。(由于这种必要性很少,因此该标志并不常用)。

pdwThreadID参数:它必须是DWORD的一个有效地址,CreateThread使用这个地址来存放系统分配给新线程的I D

        函数创建新线程的时候,需要提供一个线程函数入口,而且线程函数必须是全局函数,而不能是普通的类成员函数。
            (1)线程函数使用类的静态成员函数。由于类的静态成员函数只能访问类的静态成员变量,所以在线程函数中无法访问该类的非静态成员变量。
            (2)线程函数仍然是全局函数,但给线程函数传递一个类的静态对象(考虑到生命期)的指针作为参数,在线程函数中再调用该静态对象的成员函数来实现各种功能。
            (3) 为了能够在线程函数中访问类的私有成员变量,可以将线程函数声明为该类的友元函数。这样不仅解决了静态成员函数中无法访问该类的非静态成员变量的问题,也解决了在全局线程函数中无法访问类的私有成员变量的问题。

2、C运行时库函数 _beginthreadex;

unsigned long _beginthreadex( void *security, unsigned stack_size, unsigned ( __stdcall *start_address )( void * ), void *arglist, unsigned initflag, unsigned *thrdaddr );

 //第1个参数:安全属性,NULL为默认安全属性
 //第2个参数:指定线程堆栈的大小。如果为0,则线程堆栈大小和创建它的线程的相同。一般用0
 //第3个参数:指定线程函数的地址,也就是线程调用执行的函数地址(用函数名称即可,函数名称就表示地址)
 //第4个参数:传递给线程的参数的指针,可以通过传入对象的指针,在线程函数中再转化为对应类的指针
 //第5个参数:线程初始状态,0:立即运行;CREATE_SUSPEND:suspended(悬挂)
 //第6个参数:用于记录线程ID的地址

3、MFC接口函数AfxBeginThread;

    

CWinThread* AfxBeginThread(

   AFX_THREADPROC pfnThreadProc,//线程函数地址

   LPVOID pParam,//线程参数

   int nPriority = THREAD_PRIORITY_NORMAL,//线程优先级

   UINT nStackSize = 0,//线程堆栈大小,默认为1M

   DWORD dwCreateFlags = 0,//

   LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL

);

以上三个函数,_beginthreadex, AfxBeginThread函数都依赖于系统API CreateThread


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/sshhbb/archive/2011/01/10/6127762.aspx

posted @ 2011-04-15 16:27  山河  阅读(208)  评论(0编辑  收藏  举报