线程之间不能传递窗口对象指针,那 同一线程不同函数之间能不能传递窗口对象等的指针呢?比如:
(1):
CDC* m_pDC;Fun1()
{
m_pDC = this->getDC() ;
}Fun2()
{
m_pDC->BitBlt(.....);}
行不行??(2):
CButton* m_pBt;
Fun1()
{
m_pBt = GetDlgItem(IDC_BUTTON1);
}Fun2()
{
m_pBt->SetWindowText("yes");}
这样行不行??

解决方案 »

  1.   

    一般在线程启动前把窗口句柄传入。参考:
    http://topic.csdn.net/u/20071013/18/11b4884d-777f-4507-a71b-69d0fe219853.html
      

  2.   

    线程之间一般传句柄,传指针是危险的。然后用CWnd::FromHandle(HWND hWnd)获取一个CWnd*来对其进行操作。主要原因是每个线程都有一个自己的句柄映射表,也就是句柄跟窗口对象之间的影射表。在创建窗口的时候,会自动地将句柄和该CWnd对象的影射关系写进表中。而这个表是线程局部的,也就是说在别的线程中是看不见的。而很多MFC成员函数中都有ASSERT_VALIDA(this);这里边会调用ASSERT_VALID成员函数,这个函数又会去查句柄映射表,而在别的线程中,该表是看不见的,所以会出问题。有一部分内联的成员函数是可以的,而一部分成员函数是不可以的,这取决于在那部分成员函数中做了什么,如果需要查找句柄映射表的话是绝对不可以的。解决办法就是上面提到的。
       
      

  3.   


    CButton* m_pBt; 
    Fun1() 

    m_pBt = GetDlgItem(IDC_BUTTON1); 
    } Fun2() 

    m_pBt- >SetWindowText("yes"); } 
    这样好象并不出错啊??但我在书上看到说不行的 :”临时包装对象会在空闲时间删除.在同一函数中多次使用是没用问题的,不同函数中使用先前保存下来的指针就有可能出错“