建立线程的几种方法
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