MS Visual C ++ Многопоточность доступа к выделенным переменным вызывает нарушение прав доступа

У меня есть проблема со сборкой приложений на основе диалогового окна MFC с MSVC 2013. Чтобы сделать основной диалог доступным также во время более сложных функций, я использую многопоточность. Щелчок по кнопке в диалоговом окне вызывает «рабочую функцию», которая обрабатывается другим потоком.

Вот выдержка из класса:

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 переменная динамическая. Заранее спасибо за помощь!

PS: когда я оценил это поочередно, то есть при запуске DoSweepAndImage Функция в основном потоке, все идет хорошо. Вот почему я предполагаю, что нарушение прав доступа связано с многопоточностью.

@ Wimmel: цикл закончился i в DoSweepAndImage является

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

1

Решение

Задача ещё не решена.

Другие решения