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
。functionDoSweepAndImage
では、クラスの変数にアクセスします (読み取りと書き込み)。などがあり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 defineの代わりに静的配列を使用するCString imgs_name[4];
と、すべてがうまく機能します。CString
ただし、その変数を動的変数にしたいと考えています。よろしくお願いします。
PS: これをシリアルに評価したとき、つまりDoSweepAndImage
メイン スレッドで関数を実行したときは、すべてうまくいきました。そのため、アクセス違反はマルチスレッドが原因であると想定しています。
@Wimmel : ループオーバーi
はDoSweepAndImage
for (UINT16 i = 0; i < steps; i++)