最近看一个国外大牛的文章, 有类似如下的代码:
CMyView 是从CView中派生出来的Viewvoid CMyView:: doSomethingLengthy()
{
   。。
   _beginthread(myWorkerThread,0, (PVOID)this);  //注意:是把整个view对象作为参数传递进去了
}(static) void CMyView::myWorkerThread(PVOID pvoid)  
{
   CMyView* me = (CMyView*)pvoid;
   me->run();}void CMyView::run()  
{
   //在这里做真正的工作,并可以直接使用CMyView中的成员变量和方法。
  。。
   
}请问这样做有没有问题,疑问如下?
 把MFC的CMyView对象直接做为线程参数传递?我记得很多书上说这样是应该避免的,应该把该mfc对象对应的句柄传进去,否则很可能出错。我的理解是: 在CMyView::run()方法中,可以使用自定义的成员变量和方法,只要该方法没有进行MFC界面相关的操作,如果跟界面相关的操作,仍然需要用postmessage之类的方法通过消息来操作。否则很有可能出问题。 也就是说在run()中的调用CMyView类相关的方法要非常小心,并不是绝对安全的。 
我的理解对不对?如果我的理解没问题,是不是上面程序的写法不是一个很好的风格?

解决方案 »

  1.   

    没什么问题
    可以看看run里的代码。里面应该不涉及到消息处理相关的东西当然不赞同直接操作界面
      

  2.   

    请问这样做有没有问题,疑问如下?
     把MFC的CMyView对象直接做为线程参数传递?我记得很多书上说这样是应该避免的,应该把该mfc对象对应的句柄传进去,否则很可能出错。
    ===========
    这种做法经常见到,一般也不会出现问题,但是不推荐用。主要的原因可以还是传入线程的指针失效的问题吧,建议传句柄,然后发消息之类的进行处理。
      

  3.   

    传递的是this,是对象指针。呵呵
      

  4.   

    我的问题是:采用这种方法,如果在run()函数中不够仔细,很容易出错,特别是直接操作mfc对象的某些跟界面有关的方法,很容易引发 Assert的失败!  所以这种编程风格不应该被推荐,是不是这样?
      

  5.   

    5楼说到了关键,传的是对象指针又不是对象,传对象是非常危险的,别说这个类的对象,即使一个CFile对象都不可以随便就传。
    我个人认为指针比句柄还要更方便有效,我就经常这样用,相当于从外部推动View,没什么不好吧。
    通常在一个进程里View类都是持久有效,不会出问题。
      

  6.   

    我的问题是:传递的是MFC对象! 有的时候,mfc窗口类对象的方法在多线程中会有问题!因为 MFC对象不是线程安全的,特别是handle和窗口的map是线程相关的。当然,很多时候这么做也没有问题,但总是很担心。
      

  7.   

    _beginthread(myWorkerThread,0, (PVOID)this);  //注意:是把整个view对象作为参数传递进去了
    =================================================================分明是个指针吗。
      

  8.   


    mfc的指针在线程里是不安全的,难度不是么?
      

  9.   

    我也觉得传MFC对象给线程并不是太好,还是传句柄最好,安全,不用担心。