0

リスト ボックスから複数選択した結果を CStringArray の形式で返すダイアログ ボックスがあります。返された結果をファイル処理用のスレッドに渡します。スレッド内の配列を次のように参照します。

CStringArray* m_CStringArray = (CStringArray*)pParam;

次のように要素にアクセスします。

m_CStringArray->GetAt(1);

しかし、私は空の要素を取得します。を使用してカウントを取得した場合。

INT_PTR total_count = m_CStringArray->GetCount();

渡された配列に適切なカウントを返します。スレッドに渡された CStringArray 要素にアクセスする適切な方法は何ですか?

4

1 に答える 1

1

未定義の動作をしているようです。あなたが犯したかもしれない間違いはCStringArray、新しいスレッドを開始したときにローカルを使用したことですが、新しいスレッドがプロセッサ時間を取得する前にローカルコピーがスコープ外になる可能性があることを忘れていました.

CStringArrayこれを回避する最も簡単な方法は、( を使用して) をヒープに割り当てnew、スレッドに破棄させることです。

if(m_ProcessDlg.DoModal() == IDOK)
{
    CStringArray *arr = new CStringArray;
    arr->Copy( m_ProcessDlg.m_ProcessArray );
    CWinThread *pThread = AfxBeginThread( ExtractThread, (LPPARAM)arr );
}
于 2013-11-04T01:27:31.890 に答える