请教高手:子线程如何向主线程中窗口发送消息

snrpl 2005-08-01 09:27:51
在对话框窗口的确认按键事件中起了一个线程,向该窗口发送消息但窗口始终不能接收。哪位好心人帮我看看。


代码如下:
线程声明.h
static UINT MyThread(LPVOID lpstr);

.cpp

void CTestThreadDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
//AfxBeginThread(MyThread,this);

AfxBeginThread(MyThread,this);
Sleep(10);
OnOK();
}
UINT CTestThreadDlg::MyThread(LPVOID lpstr)
{
CTestThreadDlg* pDlg;
pDlg=(CTestThreadDlg*)lpstr;
::PostMessage(pDlg->m_hWnd,WM_CHAR,0x30,NULL);
Sleep(100);
return 0;

}

void CTestThreadDlg::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default

CDialog::OnChar(nChar, nRepCnt, nFlags);
}
...全文
676 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
会思考的草 2005-08-01
  • 打赏
  • 举报
回复
另,不要调用OnOk试试,sleep(10)不能保证你的线程一定在退出之前发送消息。有可能发送消息的时候主窗口已经销毁(虽然CDialog类的对象可能还存在)。
会思考的草 2005-08-01
  • 打赏
  • 举报
回复
你传送CWnd指针是极其错误的做法。MFC不是线程安全的库,它的内部有一个map类,负责将hwnd映射到对象,这个map类是保存在tls中的,线程切换后,不能保证传进来的CWnd指针指向的对象在本线程的tls中依然存在,跨线程必须传递句柄。
会思考的草 2005-08-01
  • 打赏
  • 举报
回复
启动的时候把主窗口的句柄作为参数传入线程函数。
snrpl 2005-08-01
  • 打赏
  • 举报
回复
谢谢各位,你们说的方法我都试过,还是不行的。
flyelf 2005-08-01
  • 打赏
  • 举报
回复
AfxBeginThread(MyThread,this);
Sleep(10);
OnOK();// 可能此时主窗口已经退出了
dirdirdir3 2005-08-01
  • 打赏
  • 举报
回复
CTestThreadDlg::MyThread(LPVOID lpstr)

线程最好不要用类里面的成员函数,不然会有很多问题的,你试试用全局的函数试试。
DentistryDoctor 2005-08-01
  • 打赏
  • 举报
回复
可以考虑HWND


AfxBeginThread(MyThread,this);
Sleep(10);
OnOK();

Sleep blocked the main thread,
DentistryDoctor 2005-08-01
  • 打赏
  • 举报
回复
最好不好在非线程间传递CWnd*

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧