У меня есть проблема со сборкой приложений на основе диалогового окна 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++)
Задача ещё не решена.