CSimpleString中的旧版MFC跨线程异常

时间:2013-03-12 12:19:12

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

我有一个旧的legecy ATL / MFC应用程序,有两个线程,主要是Window-Thread和Render-Thread。我的问题是我有一个与CSimpleString相关的随机,访问冲突错误;即访问冲突,0xdddddddd等...

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

从MFC方面;这个班是

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

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

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

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

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

任何人都有使MFC线程安全并避免这些问题的智慧吗?

1 个答案:

答案 0 :(得分:3)

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