MFC应用在Csinglelock锁后悬挂()

MFC App hangs after CSingleLock Lock()

本文关键字:应用 Csinglelock MFC      更新时间:2023-10-16
void CADAPBatchView::AddMsgToStatusWindow(const CString& strMsg)
{
    CString strTemp;
    CString strEngineStatusEntry;
    int nLinesToScrollPast = 0;
    int nTrimPos = 0;
    strEngineStatusEntry.Format(_T("%s %sn"), CTime::GetCurrentTime().Format( _T( "%H:%M:%S" )), strMsg);
    CSingleLock singleLock( &m_csStatusMsg );
    singleLock.Lock();
    if (m_wndEngineStatusMsgs.GetLineCount() > 200)
    {
        m_wndEngineStatusMsgs.SetReadOnly(FALSE);   //remove readonly so SetSel will work
        m_wndEngineStatusMsgs.SetSel(0, m_wndEngineStatusMsgs.LineIndex(100));
        m_wndEngineStatusMsgs.Clear();
        m_wndEngineStatusMsgs.SetReadOnly(TRUE);    //put back readonly
    }
    int nBegin;
    nBegin = m_wndEngineStatusMsgs.GetTextLength();
    m_wndEngineStatusMsgs.SetSel(nBegin, nBegin);   // Select last character
    m_wndEngineStatusMsgs.ReplaceSel(strEngineStatusEntry);          // Append, move cursor to end of text
    //m_wndEngineStatusMsgs.SetSel(-1,0);             // Remove Black selection bars
    //nBegin = m_wndEngineStatusMsgs.GetTextLength(); // Get New Length
    //m_wndEngineStatusMsgs.SetSel(nBegin,nBegin);    // Cursor to End of new text
    nLinesToScrollPast = m_wndEngineStatusMsgs.GetLineCount() - 9 - m_wndEngineStatusMsgs.GetFirstVisibleLine();
    m_wndEngineStatusMsgs.LineScroll( nLinesToScrollPast );

    if (m_wndChkStatusMsgLog.GetCheck() == 1)
    {
        WriteToLogFile(strEngineStatusEntry);
    }
    return;
}

我已连接了显示两个线程的代码。在转储文件崩溃时,我看到主线程在singlelock.Lock()之后在线。第二个线程以nLinesToScrollPast开头。我认为发生了僵局,但不知道如何发生。感谢任何帮助,谢谢。

问题是您正在尝试制作方法AddMsToStatusWindow线程安全,以便从其他线程调用它。您的问题是,只有主应用程序线程可以与GUI进行交互,否则您最终会出现消息泵的问题(因为您确实锁定SendMessage)。因此,您的设计是错误的。您应该基于CCriticalSection创建守卫消息队列。因此,该线程将消息将消息放在队列中,然后致电PostMessage以通知主线程,该线程已将数据/消息放在队列中。主线程将在消息处理程序中的该队列中填充数据。