// net030107Dlg.cpp : implementation file
//......
void CNet030107Dlg::OnOK()
{
DWORD ReceiveThreadId;
hd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ReceiveThread,this,         0, &ReceiveThreadId); 
}
void CNet030107Dlg::ReceiveThread(LPVOID Param)
{
        CNet030107Dlg *pDlg = (CNet030107Dlg*)Param;
        pDlg->iNum=0;//无问题
        pDlg->test();//问题处}
void CNet030107Dlg::test()
{
return;
}
......这是我的一段代码。
在ReceiveThread线程中pDlg->test()有问题。并且问题仅发生在debug版。
我想请教一下为什么ReceiveThread线程不能调用CNet030107Dlg的函数?

解决方案 »

  1.   

    使用现成传递指针要注意,试着加上AfxManageState(好像是这么写)
      

  2.   

    在*h中申明:
    static void ReceiveThread(LPVOID Param)
      

  3.   

    CNet030107Dlg *pDlg = new CNet030107Dlg(Param);
    pDlg->iNum=0;//无问题
    pDlg->test();//问题处
      

  4.   

    CNet030107Dlg *pDlg = new CNet030107Dlg();
    pDlg = (CNet030107Dlg*)Param;
      

  5.   

    先谢谢各位兄弟:
    TO  ouygg(痞子酷):
      我是这么申明的static void ReceiveThread(LPVOID Param)
    TO  aben456(风轻扬):
               pDlg = (CNet030107Dlg*)Param也不行
    TO tony1978(突击召唤师).zhaolaoxin():
       能否详尽些。
      

  6.   

    “ void CNet030107Dlg::test() { return; } ”中间应该有其他代码吧,如果就这样应该不会出错。建议改用 AfxBeginThread 启动线程。
      

  7.   

    DWORD WINAPI CNet030107Dlg::ReceiveThread( LPVOID lpParam )
      

  8.   

    void CNet030107Dlg::test() { return; }中间无其他代码。
    并且问题仅发生在DEBUG版
      

  9.   

    如果可以将代码发给我,我来看看。
    [email protected]
      

  10.   

    不好意思,更正一下
    void CNet030107Dlg::test()
    {
    //注意:我使用了EDIT控件
    UpdateData(FALSE);//问题
    UpdateData(TRUE);//问题
    return;
    }
                               多谢大家帮忙。
    不明白:问题发生在DEBUG版,却在reasle版通过。to rosement()兄:
      估计经过这,您早知道是什么原因了。我就不好意思再将代码发给您了。多谢您.
      

  11.   

    本来,在线程间共享MFC窗体是微软大力反对的,一般情况下这会出错。
    但如果线程函数是MFC窗体的静态成员函数,并且生命周期与窗体生命周期相同,此时的运算是不会出错的。但MFC的检查代码并未智能到这种程度,所以跳出断言,但忽略后还是能正常运行。这就是原因与现象。关键:线程函数必须是MFC窗体的静态成员函数而不是全局函数。
      

  12.   

    to DengGuoqi000007:
      你好。老大,可不可以帮我看看
    http://expert.csdn.net/Expert/topic/1367/1367099.xml?temp=.9955255
    中的问题。
                             多谢!
      

  13.   

    新线程里再使用那个窗口好像是不安全的吧
    你可以尝试给那个窗口发送消息,让它自己去响应还有,应该将第一句写成:
    CNet030107Dlg *pDlg = (CNet030107Dlg*)Param;