我在使用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;
// ...
}
。用法是:
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}}