子线程中,父子窗口消息传递问题。
时间:2011-12-17
来源:互联网
我要做一个层级关系的架构,现在做了两层,有一些问题。
当点击start菜单时,创建一个新线程。响应函数如下:
MainFrm.cpp //(MessageLayerThread::CWinThread)
1. void CMainFrame::OnStart()
{
//传递主窗口句柄给子线程,用于在子线程中创建主窗口的子窗口
msgThread = new MessageLayerThread(m_hWnd);
msgThread->CreateThread(); //创建线程调用了InitInstance()
}
2.MessageLayerThread.cpp
MessageLayerThread::MessageLayerThread(HWND ai_hParent) : m_hwndParent(ai_hParent)
{
}
BOOL MessageLayerThread::InitInstance()
{
TRACE("Run MessageLayerThread.\n");
CWnd* pParent = CWnd::FromHandle(m_hwndParent);
CRect rect;
pParent->GetClientRect(&rect);
//3.创建子窗口 MessageLayer m_wndMsgLayerWindow 已经定义在MessageLayerThread的头文件中
BOOL m_bWindowSuccess = m_wndMsgLayerWindow.Create(_T("CMsgLayerWindow"),WS_CHILD, rect,pParent);
if (m_bWindowSuccess)
{
TRACE("MessageLayer window is created.\n");
m_pMainWnd = &m_wndMsgLayerWindow;
//4.主窗口post message
pParent->PostMessage(WM_WINDOW_CREATED,(WPARAM)m_wndMsgLayerWindow.m_hWnd);
}
return TRUE;
}
3. 创建子窗口
MessageLayer.cpp (MessageLayer::CWnd)
BOOL MessageLayer::Create(LPCTSTR szTitle, LONG lStyle, const RECT& rect, CWnd* pParent)
{
return CWnd::Create(NULL,
szTitle,
lStyle,
rect,
pParent,
MESSAGE_WINDOW_ID);
}
4.响应pParent->PostMessage(WM_WINDOW_CREATED,(WPARAM)m_wndMsgLayerWindow.m_hWnd)消息函数如下:
MainFrm.cpp
LRESULT CMainFrame::OnMessageWindowCreated(WPARAM wParam, LPARAM lParam)
{
if(msgThread != NULL)
{
//5.如果子线程创建成功,子窗口post message
msgThread->m_pMainWnd->PostMessage(ON_RUN,0,0);
}
return true;
}
5. 响应msgThread->m_pMainWnd->PostMessage(ON_RUN,0,0)消息响应函数如下:
MessageLayer.cpp(MessageLayer::CWnd)
LRESULT MessageLayer::OnRun(WPARAM wParam, LPARAM lParam)
{
bool flag = false;
while(!flag){
TRACE("\n waiting data");
Sleep(1);
}
return true;
}
在调用while loop之后,不能对主窗口做任何操作。。。
有几个问题,请教一下大家:
1 我尝试过直接在1. OnStart()方法里面,在msgThread->CreateThread();之后直接在此用子窗口PostMessage
msgThread->m_pMainWnd->PostMessage(On_Run,0,0),发现消息无响应。。。。InitInstance函数在什么时候被调用,不是在createThread之后吗?如果是的话,这里子窗口在此函数中已经被生成。。。但是消息没有得到响应是为什么?
2 因为我尝试以上的发放,发现没有用,才改成现在这样,在InitInstance函数内,创建子窗口之后又父窗口postMessage,然后再判断当子线程创建之后,由子窗口postMessage,这样消息得到了响应,但是这个时候不能对主窗口进行操作。我想知道这个是为什么?
知道的大牛,劳驾耐心帮我看看。。。万分感谢。
当点击start菜单时,创建一个新线程。响应函数如下:
MainFrm.cpp //(MessageLayerThread::CWinThread)
1. void CMainFrame::OnStart()
{
//传递主窗口句柄给子线程,用于在子线程中创建主窗口的子窗口
msgThread = new MessageLayerThread(m_hWnd);
msgThread->CreateThread(); //创建线程调用了InitInstance()
}
2.MessageLayerThread.cpp
MessageLayerThread::MessageLayerThread(HWND ai_hParent) : m_hwndParent(ai_hParent)
{
}
BOOL MessageLayerThread::InitInstance()
{
TRACE("Run MessageLayerThread.\n");
CWnd* pParent = CWnd::FromHandle(m_hwndParent);
CRect rect;
pParent->GetClientRect(&rect);
//3.创建子窗口 MessageLayer m_wndMsgLayerWindow 已经定义在MessageLayerThread的头文件中
BOOL m_bWindowSuccess = m_wndMsgLayerWindow.Create(_T("CMsgLayerWindow"),WS_CHILD, rect,pParent);
if (m_bWindowSuccess)
{
TRACE("MessageLayer window is created.\n");
m_pMainWnd = &m_wndMsgLayerWindow;
//4.主窗口post message
pParent->PostMessage(WM_WINDOW_CREATED,(WPARAM)m_wndMsgLayerWindow.m_hWnd);
}
return TRUE;
}
3. 创建子窗口
MessageLayer.cpp (MessageLayer::CWnd)
BOOL MessageLayer::Create(LPCTSTR szTitle, LONG lStyle, const RECT& rect, CWnd* pParent)
{
return CWnd::Create(NULL,
szTitle,
lStyle,
rect,
pParent,
MESSAGE_WINDOW_ID);
}
4.响应pParent->PostMessage(WM_WINDOW_CREATED,(WPARAM)m_wndMsgLayerWindow.m_hWnd)消息函数如下:
MainFrm.cpp
LRESULT CMainFrame::OnMessageWindowCreated(WPARAM wParam, LPARAM lParam)
{
if(msgThread != NULL)
{
//5.如果子线程创建成功,子窗口post message
msgThread->m_pMainWnd->PostMessage(ON_RUN,0,0);
}
return true;
}
5. 响应msgThread->m_pMainWnd->PostMessage(ON_RUN,0,0)消息响应函数如下:
MessageLayer.cpp(MessageLayer::CWnd)
LRESULT MessageLayer::OnRun(WPARAM wParam, LPARAM lParam)
{
bool flag = false;
while(!flag){
TRACE("\n waiting data");
Sleep(1);
}
return true;
}
在调用while loop之后,不能对主窗口做任何操作。。。
有几个问题,请教一下大家:
1 我尝试过直接在1. OnStart()方法里面,在msgThread->CreateThread();之后直接在此用子窗口PostMessage
msgThread->m_pMainWnd->PostMessage(On_Run,0,0),发现消息无响应。。。。InitInstance函数在什么时候被调用,不是在createThread之后吗?如果是的话,这里子窗口在此函数中已经被生成。。。但是消息没有得到响应是为什么?
2 因为我尝试以上的发放,发现没有用,才改成现在这样,在InitInstance函数内,创建子窗口之后又父窗口postMessage,然后再判断当子线程创建之后,由子窗口postMessage,这样消息得到了响应,但是这个时候不能对主窗口进行操作。我想知道这个是为什么?
知道的大牛,劳驾耐心帮我看看。。。万分感谢。
作者: Janet1123 发布时间: 2011-12-17
没有必要采用多线程驱动窗口,这样做还会降低窗口系统的整体性能,毫无价值。
作者: sinservice 发布时间: 2011-12-17
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28