+ -
当前位置:首页 → 问答吧 → 子线程中,父子窗口消息传递问题。

子线程中,父子窗口消息传递问题。

时间: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,这样消息得到了响应,但是这个时候不能对主窗口进行操作。我想知道这个是为什么? 

知道的大牛,劳驾耐心帮我看看。。。万分感谢。

作者: Janet1123   发布时间: 2011-12-17

没有必要采用多线程驱动窗口,这样做还会降低窗口系统的整体性能,毫无价值。

作者: sinservice   发布时间: 2011-12-17