一:
我在AA类中的成员函数xy()中创建线程如下:
AfxBeginThread(Mypro,this);在Mypro中执行如下语句:
((AA*)pParam)->SendMessage(WM_MYOWN);//自定义消息
return 0;执行很功,AA的响应WM_MYOWN消息的成员函数也得到了调用,但再一次执行xy()时,就出现非法操作。例如xy()响应一按钮单击,按一次还行,再按一次就非法操作了。
我把上面的SendMessage改为PostMessage也一样!为什么?
二:书上说要创建用户线程,需要从CWinTread派生一个类,必需用DECLAER_DYNCREATE和IMPLEMENT_DYNCREATE对该类进行申明和实现,其它的就没说了,哪位能不能举个例子,我还是不太明白。

解决方案 »

  1.   

    /***************************************************
     .h
    ************************************/class CDlgDlg : public CDialog
    {
    public:
    static UINT DlgThreadProc(LPVOID pParam);
    public:
      virtual void OnOK();
     afx_msg void OnPrintMsg(WPARAM wp,LPARAM lp);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };
    /***************************
    *.cpp
    ************************/#define WM_PRINTMSG     WM_APP+0X111BEGIN_MESSAGE_MAP(CDlgDlg, CDialog)
    //{{AFX_MSG_MAP(CDlgDlg)
    ON_MESSAGE(WM_PRINTMSG,OnPrintMsg)
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()void CDlgDlg::OnOK() 
    {
    // TODO: Add extra validation here
      CWinThread *pt=AfxBeginThread(DlgThreadProc,this);}
    void CDlgDlg::OnPrintMsg(WPARAM wp,LPARAM lp)
    { AfxMessageBox("hahhhah");
    }
    UINT CDlgDlg::DlgThreadProc(LPVOID pParam)
    {
       ((CDlgDlg *)pParam)->SendMessage(WM_PRINTMSG);
    return 0;
    }
    能够正常运行,每一次点击ok,都会正常显示信息。
    //////////////////////////////////////////////////
    如果用类作为AfxMessageBox的参数,则在该类中,需要一个窗口处理函数。
    必须对该类实例化,也就是说,改写类的InitInstance函数,Create一个窗口出来。worker thread是不需要窗口消息处理的,所以只需要一个线程函数即可。
      

  2.   

    static UINT DlgThreadProc(LPVOID pParam);
    请问上面的去掉static会如何?
      

  3.   

    用static定义的函数,
    表示该函数可以在其他地方直接调用。
    在形式上属于类,在内容上不属于类(太玄了,我不记得是谁说的了);
    去掉static 会报错!!
      

  4.   

    我知道原因了:
    我把afx_msg  void  OnPrintMsg(WPARAM  wp,LPARAM  lp);写成了:
    afx_msg  void  OnPrintMsg();
    后面我把void  CDlgDlg::OnPrintMsg(WPARAM  wp,LPARAM  lp)写成了:
    void  CDlgDlg::OnPrintMsg()
    这样能通过编译,但运行时就出现我一楼说的错误,高手能解答一下为什么吗?
      

  5.   

    这样的话Debug版可以运行,因为有保护措施
    Release版的话根本就不能运行
      

  6.   

    Knowledge Base  
    Q195032 PRB: Incorrect Function Signatures May Cause Problems in Release
    http://support.microsoft.com/support/kb/articles/Q195/0/32.ASP
      

  7.   

    在某个CLASS 内定义的线程函数须使用STATIC。
    如果定义在CLASS外面,即全局函数就不用STATIC修饰了。