AfxBeginThread 传参

来源:互联网 发布:华为研发投入 知乎 编辑:程序博客网 时间:2024/06/03 05:54

      用MFC开发时,经常会用到多线程,它的启动方式就是通过AfxBeginThread这个方法来创建,然后启动,比如标准的方式:

  CWinThread *pthread = AfxBeginThread(方法名, (LPVOID) 入参, THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);

      入参就是传给执行方法的参数,这里只能传一个参数,如果想传多个,可以传struct或者class,个人建议传class,这样可以更好的控制数据以及一些内存操作,一般传的是this这个值,因为执行方法需要是static的方法,不传this很难调用类中的非static方法,但很多时候传this是不够的,需要传一些临时变量,这时候需要将变量与this一起封成一个class然后传入,但是这里需要注意几点:

      1)传入的必须是可以转换成(void *)类型的,也就是说必须传入指针或者&变量,由于多线程执行的不确定性,&变量的方式如果变量是临时变量,会出现很多的问题,比如int,最终方法取到的值与传入的不相同,string为NULL,CString乱码等等,所以以Class *c = new Class()的方法会更稳妥。

      2)以new的方式传入,就带来了一个问题,何时delete,一般new与delete的对应都是:

                Class *c = new Class();

                function(c);

                delete c;

           这是顺序流程,可以确保执行完function才会delete,但是多线程之间如果这样做:

 

                Class *c = new Class();

                CWinThread *pthread = AfxBeginThread(function, (LPVOID)  c, ......);

                if(pthread != NULL) pthread->ResumeThread();

                delete c;

           不能保证是执行完对应的方法才delete,可以说这么做根本就是不对的,方法操作的对象已经被delete了,结果可想而知,很多时候也会出现第1点中的那些情况,所以这里应该确保方法执行完毕才会delete,那些这么写就不对了,而应该:

 

                Class *c = new Class();

                CWinThread *pthread = AfxBeginThread(function, (LPVOID)  c, ......);

                if(pthread != NULL) pthread->ResumeThread();

           然后在function内部delete:

                function(LPVOID pParam) {

 

                   Class *c = (Class *) pParam;

                   ..................

                   delete c;

                }

           这样传递给function的对象操作是没有问题的。

      3)入参对象的成员变量,基本类型的直接赋值就可以了,但是类成员变量如string,CString一定要声明成指针类型,并在赋值的时候通过new赋值,同样,赋值之后,不要delete,而是将所有类成员变量的delete全部放在这个类的析构函数中,这样delete这个类的时候也会一并delete所有的类成员变量。

      4)必须注意,对于this的赋值直接传this就可以了,并且绝对不能在任何地方delete。

      这样就可以保证传参的正确性了,引起的诸多问题其实还是内存控制的原因。

注:CWinThread *pthread = AfxBeginThread(方法名, this)中传入this理解:

线程函数一般都只能是静态成员函数或者全局函数全局函数跟类没有关系;静态成员函数属于类不属于对象,不能在线程函数中直接使用this指针this指针是指向对象自己的指针,即有了对象才有this指针。若想在线程函数中引用类中成员函数或变量,必须传入this。


类的成员函数  类的静态函数区别:

成员函数在实现上会有个隐藏的参数 this,通过这个this可以访问到对象的一些东西;

静态函数等效全局函数, 没有this。



原创粉丝点击