1

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 : ループオーバーiDoSweepAndImage

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

0 に答える 0