线程函数应该设为全局或在类里设为Static会好点线程函数要用类A(对话框类)里的成员同时也要用到类A的指针。
但是如果设成类A里的static函数,退出这个类的话,类A指针是不是也就销毁掉了
这样线程函数就无法继续执行下去。(暂时我是传类A的this指针进去)
如果设成全局的话又该如何获取类A的数据成员和指针。
注:类A是一个对话框类,而且是用DoModal生成的。
我想让线程函数在DoModal对话框退出后依然能够执行。
这样该如何解决呢?

解决方案 »

  1.   

    线程函数要用类A(对话框类)里的成员同时也要用到类A的指针。 
    ===================
    不要忘了,如果设成类的static成员函数的话,引用的类成员必须也要是static型的,另外,static型的函数或是成员和当前对象指针没有关系
      

  2.   

    不管是类A的static还是全局的,你要用类A的成员,你都要传个类A的指针进去!
    你想让对话框退出后线程还能执行,那还是不要用类A的成员吧!
      

  3.   

    其实全局和类静态函数都是一样的
    因为你可以在dialog定义一个函数如下所示:
    DWORD WINAPI MyThreadProc(LPVOID lpParameter)
    {
      CMyDialog* pDialog = reinterpret_cast<CMyDialog*>(lpParameter);
      return pDialog->InThreadProc(); // InThreadProc 是类的普通成员函数
    }第二个问题
    既然你将dialog指针传给了线程,那么在你的dialog析构函数中,需要先等待工作线程退出或直接关闭工作线程。
      

  4.   

    dword 
    thread_proc(void* param){
    if param==null,
       stop.  
    else
      class_a* pa=(class_a*)param}
      

  5.   

    线程函数中要使用类A,那就要保证类A的对象的生命期,在你线程退出前,它都是有效的,这就是为什么一般都用new来分配对象,这样,当你线程使用完了的时候再delete释放...可以比较好的控制生命期
      

  6.   

    类A的this指针要保证在线程函数中的一直有效...可以用new
      

  7.   

    MFC的一些东西(包括对话框)是不能多线程访问的,最好是发消息通知对话框,不能在线程中直接访问对话框。
    mydlg.h
    /** 对话框类 */
    class CMyDlg
    {
    public:
       /**
        * 线程参数 ,用来传窗口的句柄
        */
       class CThreadParam
       {
        public:
           CThreadParam(HWND hWnd):m_hWnd(hWnd){}
           HWND GetHwnd()const{return m_hWnd;}
        private:   
           HWND m_hWnd;
        };
        afx_msg LRESULT OnRecvTheMessage(WPARAM wp,LPARAM lp);
        static const UINT m_nMsgId;//线程用该消息来通知Dlg
        static UINT ThreadFun(LPVOID);//线程函数
    };mydlg.cpp
    const CMyDlg::m_nMsgId = 12121;
    //消息映射
    BEGIN_MESSAGE_MAP
    ON_MESSAGE(m_nMsgId,OnRecvTheMessage)
    END_MESSAGE_MAP////某个用来启动线程的函数
    void CMyDlg::SomeFunction()
    {
        CThreadParam threadParam(this->GetSafeHwnd());
        AfxBeginThread(ThreadFun,&threadParam);
    }
    ////对线程发来的消息进行响应
    LRESUT CMyDlg::OnRecvMessage(WPARAM wp,LPARAM lp)
    {
       ////在这里做你的响应
       return S_OK;
    }
    UINT CMyDlg::ThreadFun(LPVOID lpParam)
    {
       CThreadParam* pParam = reinterpret_cast<CThreadParam*>(lpParam);
       ////做一些你想做的事
       
       ////发消息通知对话框,wparam,lparam是你自己可以填的一些参数
       ::PostMessage(pParam->GetHwnd(),m_nMsgId,wparam,lparam);
       return 0;
    }
    replied by ebenzhang.blogbus.com
      

  8.   

    更正一下
    ////某个用来启动线程的函数
    void CMyDlg::SomeFunction()
    {
        ////这里要用new。
        CThreadParam* pThreadParam = new CThreadParam(this->GetSafeHwnd());
        AfxBeginThread(ThreadFun,pThreadParam);
    } ps:代码是我随手写的,不保证编译得过replied by ebenzhang.blogbus.com