一:
我在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对该类进行申明和实现,其它的就没说了,哪位能不能举个例子,我还是不太明白。
我在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对该类进行申明和实现,其它的就没说了,哪位能不能举个例子,我还是不太明白。
.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是不需要窗口消息处理的,所以只需要一个线程函数即可。
请问上面的去掉static会如何?
表示该函数可以在其他地方直接调用。
在形式上属于类,在内容上不属于类(太玄了,我不记得是谁说的了);
去掉static 会报错!!
我把afx_msg void OnPrintMsg(WPARAM wp,LPARAM lp);写成了:
afx_msg void OnPrintMsg();
后面我把void CDlgDlg::OnPrintMsg(WPARAM wp,LPARAM lp)写成了:
void CDlgDlg::OnPrintMsg()
这样能通过编译,但运行时就出现我一楼说的错误,高手能解答一下为什么吗?
Release版的话根本就不能运行
Q195032 PRB: Incorrect Function Signatures May Cause Problems in Release
http://support.microsoft.com/support/kb/articles/Q195/0/32.ASP
如果定义在CLASS外面,即全局函数就不用STATIC修饰了。