线程的创建

来源:互联网 发布:拍摄淘宝图片技巧 编辑:程序博客网 时间:2024/06/06 12:42

建立线程的几种方法

   1)CreateThread(线程执行函数必须是全局的)

使用方法:

         //线程执行函数声明  
         DWORD WINAPI ThreadProc(LPVOID lpParam);
  

        //创建线程

        CreateThread(NULL,0,ThreadProc, &Info[i],0,&dwThreadID[i]);  

解释:

DWORD 就是 Double Word, 每个word为2个字节的长度,DWORD 双字即为4个字节,每个字节8位,共32位

WINAPI 视窗操作系统应用程序接口(Windows API)

LPVOID,是一个没有类型的指针,一个32位指针,指向一个未指明的类型的值

执行函数即每个线程怎么区分,所要做的事情,左后返回每个线程的ID,因此是双字节的ID,这里是指向窗口的

 CreateThread函数的参数,第一个是安全属性的设定及继承,第二个是堆栈的大小,第三个是执行函数,

         第四个是执行函数的 参数,第五个是指向DWORD的指针,存放线程的ID。

         注意:传递给线程执行函数的参数不能是局部变量,而且必须是参数的地址。如:

Int nOffset = 10;

CreateThread(NULL,0,ThreadProc,nOffset,0,&dwThreadID[i]);//错误

CreateThread(NULL,0,ThreadProc,&nOffset,0,&dwThreadID[i]);//错误

Int *pOffset = newint(10);

CreateThread(NULL,0,ThreadProc,pOffset,0,&dwThreadID[i]);//正确

  (此处参考http://blog.csdn.net/cbnotes/article/details/8277180)



    2)AfxBeginThread (线程执行函数必须是static成员函数)

   用户界面线程和工作者线程都是由AfxBeginThread创建的。现在,考察该函数:MFC提供了两个重载版的AfxBeginThread,一个用于用户界面线程,另一个用于工作者线程,分别有如下的原型和过程:


  工作者线程的AfxBeginThread 

工作者线程的AfxBeginThread的原型如下:

CWinThread* AFXAPI AfxBeginThread(

AFX_THREADPROC pfnThreadProc, //线程的入口函数,声明如下: UINT MyThreadFunction( LPVOID pParam )

LPVOID pParam,//传递入线程参数,注意类型为:LPVOID,所以我们可传递结构体入线程

int nPriority, //3、4、5分别指优先级、堆栈大小、创建标识、安全属性,含义同用户

UINT nStackSize,                            

DWORD dwCreateFlags,

LPSECURITY_ATTRIBUTES lpSecurityAttrs)   


 使用方法:

     //声明线程执行函数:static UINT ThreadProduct(void *param);

     //创建线程:m_pThreadConsumer = AfxBeginThread(ThreadConsumer,this);//后面的参数都省略了

     //把this传过去,就可调用类成员. 线程函数就可使用和操作类的成员。注意线程函数是静态类函数成员。

       想要结束非UI线程,可以直接AfxEndThread



 用户界面线程的AfxBeginThread 

用户界面线程的AfxBeginThread的原型如下:

CWinThread* AFXAPI AfxBeginThread(

CRuntimeClass* pThreadClass,    //从CWinThread派生的RUNTIME_CLASS类

int nPriority,     //定线程优先级,如果为0,则与创建该线程的线程相同;

UINT nStackSize,     //线程的堆栈大小,如果为0,则与创建该线程的线程相同;

DWORD dwCreateFlags,    //创建标识,CREATE_SUSPENDED,则悬挂状态创建,否则创建后执行。

LPSECURITY_ATTRIBUTES lpSecurityAttrs)  //线程的安全属性,NT下有用


使用方法:因为要处理消息所以需要建立一个消息循环。从CWinThread派生出一个类,再调用AfxBeginThread产生一个CWinThread对象。因为消息循环的存在,要结束一个UI线程必须在消息队列中放一个WM_QUIT


     上述解释参考:http://blog.csdn.net/sd2131512/article/details/6601228


     具体使用哪一种函数创建线程见http://blog.csdn.net/hellokandy/article/details/50866641


     注意:无论是worker 或者UI线程,结束时都必须delete CwinThread对象



3 关于多线程计算的速度和cpu使用效率的解答

   http://blog.csdn.net/zollty/article/details/53944539

0 0