多线程编程之创建工作者线程

来源:互联网 发布:杀病毒的软件 编辑:程序博客网 时间:2024/05/07 11:03

由于之前项目用到了多线程,但每怎么看MSDN的文档,今天复习便仔细看了下,全文翻译如下:

工作者线程:

工作者线程通常用来在后台执行一些用户不需要等待的任务,如一些比较耗时的数学计算(我项目中耗时的数学计算便是相机的标定,需要对一个比较大的矩阵进行SVD分解及其他运算)和后台打印等。

创建一个工作者线程相对来说是一个简单的任务,只需要两步就可以使你的线程工作起来:完成线程函数的编写和开始线程的执行。

线程的开始:在这里我们使用的是MFC里提供的可以重载版本的AfxBeginThread函数。一种版本用来创建工作者线程,另一种版本用来创建用户界面线程。对于创建工作者线程来说需要给AfxBeginThread传递以下参数:

1:线程控制函数的地址

2:传递给线程控制函数的参数(调用这自己决定需要传递给线程控制函数什么参数)

3:线程的优先级,缺省的优先级是正常,即被创建线程的优先级和创建它的线程的优先级相同。

4:分配给线程栈的大小,每一个线程都有一个自己专属的栈,默认值是栈的大小和创建该它的线程的栈大小一样。

5:线程是否立即执行,默认的参数为0即线程创建后立即执行。或者使用参数CREATE_SUSPENDED,使线程创建后被挂起。

6:线程安全级别,默认的安全级别和父线程级别一样。

函数AfxBeginThread创建并初始化一个CwinThread类的对象,并且启动它,返回该对象的地址,以便稍后可以使用这个对象。

线程控制函数(线程要执行的代码)的完成:一旦进入了这个函数,线程就开始了,退出了这个函数线程就终止了。线程函数的原型描述为

UINT MyControllingFunction(LPVOID pParam);

typedef void far      *LPVOID;<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">//far只在16位机器下使用,用于扩展内存寻址用,32位下就没用了。</span>

LPVOID实际上是一个没有类型额指针即void类型,你可以将任何类型的指针传递给线程函数,在线程函数里你即可以使用它也可以忽略它。比如说在线程函数里你希望对一个对象里的成员变量进行处理,那么就可以将这个对象的指针传递给线程函数。那么在这里可能有的人问题就来了为什么不把线程函数申明为类的成员函数了,这样线程函数在处理该类一个对象的成员变量时就可以不用传递该对象的指针了。事实上,我们不能把线程函数申明为一个类的成员函数,即使要这样做,也只能申明为静态成员函数,但要注意静态成员函数它不是为哪个对象所特有的,它不能访问类的非静态成员变量。

当线程函数结束时,它必须返回一个UINT类型的值来指示线程结束的原因。一般的,用返回值0代表线程的成功执行,其他值则代表不同的错误类型了。

下面是一个例子:

UINT MyThreadProc( LPVOID pParam ){    CMyObject* pObject = (CMyObject*)pParam;//在使用pParam前都必须将它转换成自己需要的类型    if (pObject == NULL ||        !pObject->IsKindOf(RUNTIME_CLASS(CMyObject)))    return 1;   // if pObject is not valid    // do something with 'pObject'    return 0;   // thread completed successfully}// inside a different function in the program...pNewObject = new CMyObject;AfxBeginThread(MyThreadProc, pNewObject);//默认的一些参数可以省略不写<strong>...</strong>



0 0
原创粉丝点击