我的程序中,有个对话框对象,我在对话框中创建了一个线程,执行函数为静态函数时,不能调用对话框对象中的变量和函数,而我的程序必需调用这些函数和变量,我只想,出现此对话框之后,才建立线程,此对话框对象释放后,线程终止,怎么办呢?

解决方案 »

  1.   

    你可以把 对话框的指针传进去,调用是用指针调用即可:
    如下:
    CMyDlg::OnInitDialog()
    {
      lpMyThread=AfxBeginThread(CMyDlg::ThreadProg, this,......);
    }
    CMyDlg::DoWork()
    {
    ...
    }
    UINT CMyDlg::ThreadProc(LPARAM lparam)
    {
      CMyDlg* lpdlg=(CMyDlg*)lparam;
    ...
      lpdlg->DoWork();
    ...
    }
      

  2.   

    在对话框的WM_ONINITDIALOG处理函数中启动线程,使用this作为参数,在线程处理的开始处加入 CYourDialog * pDlg = (CYourDialog*)lParam;为对话框添加析构函数,结束线程
      

  3.   

    你可以将dlg 的指针传入线程,调用函数时用指针调用,在OnInitDialog()
    建立线程,窗口退出时销毁线程,如下:
    CMyDlg::OnInitDialog()
    {
    lpMyThread=AfxBeginThread(CMyDlg::ThreadProc,this,......);
    ...
    }
    CMyDlg::DoWork()
    {
       ...
    }
    UINT CMyDlg::ThreadProc(LPARAM lparam)
    {
    CMyDlg* lpMyDlg=(CMyDlg*)lparam;
    ......
    lpMyDlg->DoWork();
    ......}
      

  4.   

    楼上的那位说得对,这是VC编程最基本的技巧另外,至于当对话框结束之前,必须退出线程,可以这么做。在OnClose() 或OnDestroy()之类的函数中触发线程退出并等待线程退出WaitForSingleObject()
      

  5.   

    采用大家说得方法,仍然不行 ,错误如下:
    error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (long)'
    这是怎么回事?
      

  6.   

    UINT CMyDlg::ThreadProc(LPARAM lparam)
    {
    CMyDlg* lpMyDlg=(CMyDlg*)lparam;
    ......
    lpMyDlg->DoWork();
    ......}
    的申明改为static
    或者直接用全局函数
    UINT ThreadProc(LPARAM lparam)
    {
    }
      

  7.   

    我已经将ThreadProc函数说明为static,但是不行,错误如上,请指教 是否会有别的方面的原因
      

  8.   

    CMyDlg::OnInitDialog()
    {
    lpMyThread=AfxBeginThread((AFX_THREADPROC)CMyDlg::ThreadProc,this,......);
    ...
    }
      

  9.   

    要强制类型转换吧,转换成 UINT ThreadProc(LPARAM lparam) 所需要的
    LPARAM类型。
      

  10.   

    加上AFX_THREADPROC,错误如下
    error C2440: '=' : cannot convert from 'class CWinThread *' to 'class CWinApp *'
            Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
      

  11.   

    线程传参数进去就可以了,利用指针来调用进程对话框类里面的函数。把你的代码发过来看看[email protected]
      

  12.   

    CWinThread * lpMyThread=AfxBeginThread(ThreadProc,this,......);
                                                       ~~~~
    先改成0看看编译能不能通过
    其次线程函数定义:UINT MyFunction( LPVOID pParam );
                                       ~~~~~~再强之转化
      

  13.   

    正巧,前一段时间我也发现和你一样的问题:
    在线程间传递dlg对象指针是不行的,这是MFC的一个BUG,但是可以传递dlg的handle,然后在thread里用CWND::FromHandle重建这个对象就可以了.还可以用来PostMessage().
      

  14.   

    我是用CreateThread来建立线程的,不喜欢AfxBeginThread
      

  15.   

    用静态函数作线程体是可以的, 把对话框的指针传给线程不太好, 因为CWnd类的内部信息是与创建它的线程相关的,如果在别的线程中调用CWnd的函数很可能会出错。传递对话框的HWND,然后在子线程里用SENDMESSAGE吧。
      

  16.   

    To goldntman():在线程间传递dlg对象指针是不行的,不是MFC的BUG。对于这种情况MFC的设计者早就考虑到了,但他们最后决定MFC的类不支持多线程是出于性能上的考虑。这些问题在MSDN的文章中都有说明。
      

  17.   

    重载OnShowWindow,自这里启动你要的线程,并且将this指针当作县城参数传递给线程处理函数,在DistroyWindow中终止你的线程
      

  18.   

    在线程间传递dlg对象指针有危险,最好是传递窗口句柄。
      

  19.   

    在dlg中调用AfxBeginThread(func,this);函数定义为  UINT func( LPVOID );
      

  20.   

    To JJONY
    我传GetSafeHwnd()仍然是第一次的错误
     error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (__cdecl *)(long)'
      

  21.   

    error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (long)'
      

  22.   

    error C2665: 'AfxBeginThread' : none of the 2 overloads can convert parameter 1 from type 'unsigned int (long)'这个问题完全是参数不对造成的,不是原理或程序逻辑上的错误。 好好看一下MSDN严格用AfxBeginThread中参数定义的格式去使用。