Multithreading 滚动条消息在MFC中阻止线程间消息
我有一个MFC应用程序,它由多个线程组成,但问题在于具体的两个线程Multithreading 滚动条消息在MFC中阻止线程间消息,multithreading,mfc,messages,Multithreading,Mfc,Messages,我有一个MFC应用程序,它由多个线程组成,但问题在于具体的两个线程 第一个线程(CGuiThread)负责GUI(它不是主线程)并包含一个窗口对象(CMainWindow),该对象包含一个内部窗口对象(CInnerWindow),该对象显示多个进度显示并具有一个滚动条 第二个线程(CStatusDispatcherThread)负责向gui线程发送消息,其中包含与某些计算过程相关的进度状态信息 一旦计算开始,状态调度器将向GUI线程发送带有状态的消息。gui线程相应地更新内部窗口中的进度条 当我
#定义我的信息1
类CStatusDispatcherThread:publicwinthread
{
//...
//此类通过PostThreadMessage将进度状态百分比发送到gui线程
OnTimer(UINT-nIDEvent)
{
PostThreadMessage(iThreadID,MY_MESSAGE,100,0);
}
};
类CGuiThread:publicwinthread
{
//...
开始消息映射(CGuiThread,CWinThread)
在线消息(我的消息、状态消息)
结束消息映射()
私人:
CMY主窗口m_主窗口;
void OnStatusMessage(WPARAM iStatus,LPARAM dummy);
{
m_main window.updateStatus((int)iStatus)
}
};
类CMY主窗口:公共CWnd
{
//...
无效更新状态(int iStatus)
{
m_sbarWindow.updateStatusBar(iStatus);
}
私人:
CInnerWindow m_sbarWindow;
};
类CInnerWindow:公共CWnd
{
//...
void updateStatusBar(int-iStatus)
{
//...
}
私人:
BOOL创建(…)
{
CWnd::创建(strClassName、strWindowTitle、WS|u DLGFRAME、WS|u CHILD、WS|u VISIBLE、WS|u VSCROLL、,
rectofwnd、pParentWnd、iID、NULL);
}
void OnVScroll(nSBCode、NPO、pScrollBar)
{
//...
}
};代码>唯一允许更新GUI的线程是主线程。否则,你将以不可预知的行为结束。有文件证明失败。从PostThreadMessage上的MSDN页面:
如果收件人线程处于模式循环中(由MessageBox或
对话框),消息将丢失
按住滚动滑块可创建这样的模式循环。您可以通过发布到HWND而不是线程ID来消除此问题。我还有其他被阻止的消息,但它们应该由线程接收,而不是由窗口接收。我能做些什么呢?由于上面引用的原因,PostThreadMessage不应用于发布到显示任何GUI的线程。线程可以创建一个不可见窗口,用于接收发送给HWND的线程间消息。