Multithreading 滚动条消息在MFC中阻止线程间消息

Multithreading 滚动条消息在MFC中阻止线程间消息,multithreading,mfc,messages,Multithreading,Mfc,Messages,我有一个MFC应用程序,它由多个线程组成,但问题在于具体的两个线程 第一个线程(CGuiThread)负责GUI(它不是主线程)并包含一个窗口对象(CMainWindow),该对象包含一个内部窗口对象(CInnerWindow),该对象显示多个进度显示并具有一个滚动条 第二个线程(CStatusDispatcherThread)负责向gui线程发送消息,其中包含与某些计算过程相关的进度状态信息 一旦计算开始,状态调度器将向GUI线程发送带有状态的消息。gui线程相应地更新内部窗口中的进度条 当我

我有一个MFC应用程序,它由多个线程组成,但问题在于具体的两个线程

  • 第一个线程(CGuiThread)负责GUI(它不是主线程)并包含一个窗口对象(CMainWindow),该对象包含一个内部窗口对象(CInnerWindow),该对象显示多个进度显示并具有一个滚动条
  • 第二个线程(CStatusDispatcherThread)负责向gui线程发送消息,其中包含与某些计算过程相关的进度状态信息
  • 一旦计算开始,状态调度器将向GUI线程发送带有状态的消息。gui线程相应地更新内部窗口中的进度条

    当我移动或握住内部窗口滚动条的拇指时,问题就开始了——GUI线程似乎停止处理来自status dispatcher线程的状态消息,因为进度条不再更新。不仅如此,我希望状态消息在某个地方被停止,并在我释放tumb后被处理,但这并没有发生。新消息到达,但单击时丢失的消息

    如果有人知道原因是什么,我将非常感激

    我尝试在CGuiThread::PreTranslateMessage函数中“捕获”状态消息,但似乎在按住滚动拇指后,它们不再到达那里,即使CStatusDispatcherThread的PostThreadMessage指示它们已成功发送

    #定义我的信息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的线程间消息。