MS Visual C ++多线程访问分配的变量会导致访问冲突

时间:2014-09-07 15:39:04

标签: c++ multithreading visual-c++ mfc afx

我在使用MSVC 2013构建基于MFC对话框的应用程序时出现问题。为了在更复杂的功能中也可以访问主对话框,我正在使用多线程。单击对话框中的按钮会调用另一个线程计算出的“工作函数”。

以下是该课程的摘录:

class CpiezcamDlg : public CDialogEx
{
protected:
    virtual BOOL OnInitDialog();

public:
    CWinThread *m_thread1;

    void StartSweepAndImageThread()
    {
        m_thread1 = AfxBeginThread(SweepAndImageThreadProc, this);
    }

private:
    static UINT SweepAndImageThreadProc(LPVOID pParam)
    {
        CpiezcamDlg *pThis = (CpiezcamDlg *)pParam;
        UINT nRet = pThis->DoSweepAndImage();
        return nRet;
    }

    UINT DoSweepAndImage();

    UINT16 steps;
    CString *imgs_name;
};

点击按钮会调用StartSweepAndImageThreadSweepAndImageThreadProc会调用DoSweepAndImage,最后调用DoSweepAndImage。在函数imgs_name中,访问类的变量(读和写)。其中,有UINT CpiezcamDlg::DoSweepAndImage() { // ... CString str; str.Format(_T("Test")); AddStageListText(str); imgs_name[i] = str; // ... } 。用法是:

imgs_name

steps = 4; imgs_name = new CString[steps]; 初始化为

OnInitDialog

0xC0000005: Access violation reading location 0xFDFDFDF9. 函数中。

问题是当按下提示按钮时我会收到

imgs_name[i] = str;

完全在CString *imgs_name;上。当使用静态数组时,而不是CString imgs_name[4];我定义CString,一切都运行良好。但是,我非常希望DoSweepAndImage变量具有动态变量。在此先感谢您的帮助!

PS:当我以串行方式评估它时,即在主线程中运行i函数时,一切顺利。这就是为什么我认为访问冲突是由多线程引起的。

@Wimmel:DoSweepAndImage中的for (UINT16 i = 0; i < steps; i++) 上的循环是

{{1}}

0 个答案:

没有答案