【问题标题】:Legacy MFC cross-thread exception in CSimpleStringCSimpleString 中的旧版 MFC 跨线程异常
【发布时间】:2013-02-27 22:52:34
【问题描述】:

我有一个旧的 ATL/MFC 应用程序,它有两个线程,主窗口线程和渲染线程。我的问题是我有与 CSimpleString 相关的随机访问冲突错误;即访问冲突,0xdddddddd 等......

我推断问题是两个线程同时访问同一个字符串,一个尝试使用它来渲染(MFC 主窗口线程),一个尝试更新字符串(渲染线程)。

从 MFC 端;班级是

class CDisplay : public CStatic
{
public:
    CString m_strDisplay;
    ...   
    void SetDisplay(CString str, int nMode = -1);
    ...
}

没有绘制覆盖,文本基本上是通过 CStatic 呈现的。

现在,SetDisplay 方法是从 Render-Thread 调用的;它的主要代码是:

if (m_strDisplay != str)
{
    m_strDisplay = str;
    SetWindowText(str + " ");
} 

我的问题是我需要一个关键部分;但我不知道如何让 MFC 方面坚持下去。

任何人在使 MFC 线程安全并避免这些问题方面有一些智慧吗?

【问题讨论】:

  • 您可以使用 CRITICAL_SECTION 或 MFC CCriticalSection。但最好将使用定义的消息发布到同一个窗口并在消息处理程序中进行此更改。
  • 感谢您的输入,我会尝试自定义消息处理程序路由。
  • 还要确保使用 AfxBeginThread() 生成线程,否则 MFC 多线程支持会被破坏。

标签: c++ multithreading visual-studio-2008 mfc atl


【解决方案1】:

仅在 MFC 主线程中进行 GUI 更新 (SetWindowText)。在渲染线程中,设置一个变量(受临界区保护)和/或发送一条消息,然后在 MFC 主线程中执行实际的 GUI 元素操作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多