1

我在使用 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;
};

单击一个按钮调用StartSweepAndImageThread它本身调用SweepAndImageThreadProc,最后调用DoSweepAndImage. 在函数DoSweepAndImage中,访问(读取和写入)类的变量。其中,有imgs_name. 用法是:

UINT CpiezcamDlg::DoSweepAndImage()
{
    // ...
    CString str;
    str.Format(_T("Test"));
    AddStageListText(str);

    imgs_name[i] = str;
    // ...
}

whileimgs_name被初始化为

steps = 4;
imgs_name = new CString[steps];

OnInitDialog函数中。

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

0xC0000005: Access violation reading location 0xFDFDFDF9.

正好在imgs_name[i] = str;。当使用静态数组而不是CString *imgs_name;I defineCString imgs_name[4];时,一切正常。但是,我非常希望该CString变量是动态变量。在此先感谢您的帮助!

PS:当我以串行方式对此进行评估时,即DoSweepAndImage在主线程中运行该函数时,一切顺利。这就是为什么我认为访问冲突是由于多线程造成的。

@Wimmel:循环iDoSweepAndImage

for (UINT16 i = 0; i < steps; i++)
4

0 回答 0