这是我的一段源码:
//del1Dlg.h
#define WM_UPDATE WM_USER+100
...
public:
static void myThread(LPVOID Param);
...
protected:
afx_msg LRESULT OnUpdateDataMessage(WPARAM wParam, LPARAM lParam);
...// del1Dlg.cpp
...
BEGIN_MESSAGE_MAP(CDel1Dlg, CDialog)
ON_MESSAGE(WM_UPDATE,OnUpdateDataMessage)
...
END_MESSAGE_MAP()....
void CDel1Dlg::OnOK()
{
DWORD myThreadId;
HANDLE hd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myThread,this, 0, &myThreadId);
}
...
void CDel1Dlg::myThread(LPVOID Param)
{
static CDel1Dlg * pDlg =new CDel1Dlg;
::SendMessage(pDlg->GetSafeHwnd(),WM_UPDATE,0,0);
}
LRESULT CDel1Dlg::OnUpdateDataMessage(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox("Update");
UpdateData(FALSE);
UpdateData(TRUE);
return 0;
}
目的在于:
在线程myThread中避免使用pDlg->UpdateData(TRUE)等,而改用SendMessage,
WM_UPDATE为自定义的消息。
为何::SendMessage(pDlg->GetSafeHwnd(),WM_UPDATE,0,0);执行后无任何反应? 谢谢!
//del1Dlg.h
#define WM_UPDATE WM_USER+100
...
public:
static void myThread(LPVOID Param);
...
protected:
afx_msg LRESULT OnUpdateDataMessage(WPARAM wParam, LPARAM lParam);
...// del1Dlg.cpp
...
BEGIN_MESSAGE_MAP(CDel1Dlg, CDialog)
ON_MESSAGE(WM_UPDATE,OnUpdateDataMessage)
...
END_MESSAGE_MAP()....
void CDel1Dlg::OnOK()
{
DWORD myThreadId;
HANDLE hd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myThread,this, 0, &myThreadId);
}
...
void CDel1Dlg::myThread(LPVOID Param)
{
static CDel1Dlg * pDlg =new CDel1Dlg;
::SendMessage(pDlg->GetSafeHwnd(),WM_UPDATE,0,0);
}
LRESULT CDel1Dlg::OnUpdateDataMessage(WPARAM wParam, LPARAM lParam)
{
AfxMessageBox("Update");
UpdateData(FALSE);
UpdateData(TRUE);
return 0;
}
目的在于:
在线程myThread中避免使用pDlg->UpdateData(TRUE)等,而改用SendMessage,
WM_UPDATE为自定义的消息。
为何::SendMessage(pDlg->GetSafeHwnd(),WM_UPDATE,0,0);执行后无任何反应? 谢谢!
pdlg->SendMessage(WM_UPDATE,0,0);
如果自定义消息没问题,应该可以
你好!
自定义消息应该没问题,因为我在OnOk()中加入
::SendMessage(GetSafeHwnd(),WM_UPDATE,0,0);正常。
您所说的pdlg->SendMessage(WM_UPDATE,0,0);我在myThread中先前试过,
其结果 似乎 与 在myThread中直接pDlg->UpdateData(TRUE)相同:都会在debug出现错误提示,据说原因是“线程间一般不可共享MFC窗体”。我用消息,原因也正式为此。
谢谢!
你说得对, 窗体是属于线程的,不能跨线程, 线程间可以通过消息传递
窗体消息, 不过不能传窗体类(我试过了, 传过去以后,m_hwnd好像变成0了)
但如果你直接传递窗口句柄可以成功:
HANDLE hd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myThread,
this->GetSafeHwnd(), 0, &myThreadId); 或
HANDLE hd=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)myThread,
this->m_hWnd, 0, &myThreadId);
m_ThreadID = ::AfxBeginThread(::myThread,this,THREAD_PRIORITY_LOWEST);//this传入窗体指针
然后
void CDel1Dlg::myThread(LPVOID Param)
{
CDel1Dlg * pDlg =(CDel1Dlg *)Param;
pDlg->SendMessage(WM_UPDATE,0,0)
}
这样可以实现线程间共享窗体,我就是这样做的
最好使用PostMessage。你可以试试看