UINT send_set_thread(LPVOID pParam)
{ CNetSet* pNetSet = (CNetSet*)pParam ;
pNetSet->m_strText = "" ;
pNetSet->UpdateData(false) ;
        return 0 ;
}//这是我定义的线程函数,调用这个线程函数是:void CNetSet::ConfigNet()
{
AfxBeginThread(send_set_thread, this, 0, 0, 0, NULL) ;

}我想动态的在static控件上显示,但执行到pNetSet->UpdateData(false) ;时程序总是崩溃,不知为什么?
有什么好方法吗?

解决方案 »

  1.   

    断点就是UpdateData()语句那
    我问别人他说不能在非本窗口消息线程外的其他线程内调用任何和本窗口界面等一些牵扯到线程安全的东西 ,使用则直接崩溃 ,有什么需要就给窗口发消息,然后在窗口的消息线程内处理 
    对吗?
      

  2.   

    “他”说的是:在一般情况下,GDI或页面显示等方面的操作最好放在主线程即窗口自己的线程里面进行处理;数据接收或处理等操作放在新开的线程里面进行操作。但这只是一般原则并不绝对。
    个人认为,程序崩溃的原因出在 CNetSet* pNetSet = (CNetSet*)pParam 这句话上(尽管他没有直接导致程序死掉)。因为,很明显,pParam 是个空指针LPVOID,即使你把它强转成CNetSet*类型也是徒劳,你的pNetSet也没有指向static控件所在的那个窗口。
    要想解决问题,就要在你的子线程函数send_set_thread里面设法获取窗口的指针,这才是关键。
    个人意见,仅供参考。
      

  3.   

    首先要明确一点,楼主的方法在主界面比较空闲的情况下是不会崩溃的。但是这种方法本身不安全,因为线程并不知道界面线程是否空闲。updateData(False)是变量转换到控件中。确定控件和变量在主界面已经绑定。最安全的做法还是走消息循环。PostMessage或者SendMessage的方式通知主界面来完成UpdateData,这样就不会崩溃了。但这种方法要自定义消息才可以。