我在使用 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:循环i
是DoSweepAndImage
for (UINT16 i = 0; i < steps; i++)