Meirion Hughes
Meirion Hughes

Reputation: 26398

Legacy MFC cross-thread exception in CSimpleString

I have an old legecy ATL/MFC application with two threads, the main Window-Thread and a Render-Thread. My problem is I have random, access-violation errors related to a CSimpleString; i.e. access violation, 0xdddddddd etc...

I have deduced the problem is the two threads accessing the same string at the same time, one trying to use it to render (the MFC main Window-Thread) and one trying to update the string (the Render-Thread).

From the MFC side; the class is

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

There is no paint override and the text is basically rendered via CStatic.

Now, the SetDisplay method is what is called from the Render-Thread; and it prodominent code is:

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

My problem here, is that I need a critical section; but I don't know how to get the MFC side to adhere to it.

Anyone have some wisdom in making MFC thread-safe and avoiding these problems?

Upvotes: 0

Views: 434

Answers (1)

Reunanen
Reunanen

Reputation: 8001

Make GUI updates (SetWindowText) in the MFC main thread only. In the render thread, set a variable (protected by critical section) and/or send a message, and then perform the actual GUI element manipulation in the MFC main thread.

Upvotes: 3

Related Questions