主线程中新建两个用户子线程,但在主线程中给子线程发送消息,只有一个子线程窗口能接收到消息,而另一个子线程窗口接收不到消息。并且总是那个先创建的子线程能接收到消息。主线程中的InitInstance()函数如下:
BOOL CThreadMain::InitInstance()
{
m_pDlgMain = new CDlgMain; //m_pDlgMain是主线程的窗口指针
m_pDlgMain->Create(CDlgMain::IDD);
m_pDlgMain->ShowWindow(SW_SHOW); m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) ); //显示子线程
m_pThreadApply = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) ); //请求子线程
m_hThreadApply = m_pThreadApply->m_pMainWnd->m_hWnd; //显示窗口句柄
m_hThreadShow = m_pThreadShow->m_pMainWnd->m_hWnd; //请求窗口句柄
msghwnd *pmsg1=(msghwnd *)malloc(sizeof(msghwnd));
pmsg1->nTime=0;
pmsg1->m_hWnd=m_pDlgMain->m_hWnd; ::PostMessage(m_hThreadApply,WM_SENDHWNDMAIN,0,(LPARAM)pmsg1);//接收不到消息
::PostMessage(m_hThreadShow,WM_OPERATESUC,0,0); //能接收到消息
return TRUE;
}
如果上面的:
m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) ); //显示子线程
m_pThreadApply = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) ); //请求子线程改为:
m_pThreadApply = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) ); //请求子线程
m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) ); //显示子线程
则请求子线程能接收到消息,而显示子线程接收不到消息; 谢谢了!!!!!!!!!
BOOL CThreadMain::InitInstance()
{
m_pDlgMain = new CDlgMain; //m_pDlgMain是主线程的窗口指针
m_pDlgMain->Create(CDlgMain::IDD);
m_pDlgMain->ShowWindow(SW_SHOW); m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) ); //显示子线程
m_pThreadApply = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) ); //请求子线程
m_hThreadApply = m_pThreadApply->m_pMainWnd->m_hWnd; //显示窗口句柄
m_hThreadShow = m_pThreadShow->m_pMainWnd->m_hWnd; //请求窗口句柄
msghwnd *pmsg1=(msghwnd *)malloc(sizeof(msghwnd));
pmsg1->nTime=0;
pmsg1->m_hWnd=m_pDlgMain->m_hWnd; ::PostMessage(m_hThreadApply,WM_SENDHWNDMAIN,0,(LPARAM)pmsg1);//接收不到消息
::PostMessage(m_hThreadShow,WM_OPERATESUC,0,0); //能接收到消息
return TRUE;
}
如果上面的:
m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) ); //显示子线程
m_pThreadApply = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) ); //请求子线程改为:
m_pThreadApply = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) ); //请求子线程
m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) ); //显示子线程
则请求子线程能接收到消息,而显示子线程接收不到消息; 谢谢了!!!!!!!!!
解决方案 »
- D3D渲染场景的时候,大家是如何设置光源的?
- CString + 问题?
- oracle与access日期时间格式的问题
- 一个数据类型
- 关于Socket双向通信的问题
- VC 多文档很奇怪的问题
- 请交用vc等程序语言,不使用企业管理器怎么启动和加载某个数据库,启动和关闭数据库服务
- 如何解决Tab、Enter、Esc、方向键的响应问题(Activex是用VB写的,很急,谢谢)
- 找不到头文件olevariant.h,那里有
- 多进程中,如何在一个程序中获得另一个进程中窗口中的文字!
- 好像我的程序,选择编译方式为Release后,就能放到没有安装vc的机子上运行了,请问,这种情况下还要用来制作安装程序嘛?安装程序本质上
- edit 控件里面如何把光标隐藏。
你在PostMessage前断一下,看第二个窗口句柄存不存在
显示的m_hThreadApply和m_hThreadShow都有值,
并且展开m_hThreadApply和m_hThreadShow都有一个提示:“CXX0030:Error:expression cannot be evaluated”.
在这里我在补充一下:m_hThreadApply和m_hThreadShow两个窗口句柄都是在对应线程类的InitInstance()函数中赋的值,如下:
BOOL CThreadApply::InitInstance()
{
CDlgApply dlgApply;
m_pMainWnd = &dlgApply;
dlgApply.DoModal(); return TRUE;
}BOOL CThreadShow::InitInstance()
{
CDlgShow dlgShow;
m_pMainWnd = &dlgShow;
dlgShow.DoModal();
return TRUE;
}并且m_hThreadShow和m_hThreadApply对应的窗口类中响应上面在主线程所发送的消息函数如下:void CDlgShow::OnOperateSuc(WPARAM wparam,LPARAM lparam)
{
MessageBox("显示线程接受到消息!");
}void CDlgApply::OnGetThreadHwnd(WPARAM wparam,LPARAM lparam)
{
MessageBox("请求线程接受到消息");
msghwnd *pmsg = (msghwnd *)lparam;
m_hThreadMain = pmsg->m_hWnd;
delete pmsg;
}
ASSERT(::IsWindow(m_hThreadShow));
ASSERT(::IsWindow(m_m_hThreadApply));
2. 把PostMessage改成SendMessage
3. 重载子线程的PretranslateMessage, 在里面检查有没有收到你的消息
4. 设置两个通知,等两个子线程中的对话框都初始化完了以后再Post消息
我是在
m_pThreadShow = (CThreadShow *)AfxBeginThread( RUNTIME_CLASS(CThreadShow) ); //显示子线程
m_pThreadApply = (CThreadApply *)AfxBeginThread( RUNTIME_CLASS(CThreadApply) ); //请求子线程
后面加上Sleep(1000);
然后两个线程窗口都可以接收到消息了。