我有一个对话框,它以CStringArray的形式从列表框中返回多个选择的结果。我将返回的结果传递给一个线程来处理文件。我像这样在线程中引用数组:
CStringArray* m_CStringArray = (CStringArray*)pParam;
我访问元素:
m_CStringArray->GetAt(1);
但我得到一个空元素。如果我使用计数。
INT_PTR total_count = m_CStringArray->GetCount();
它确实向传入的数组返回一个正确的计数。访问传递给线程的CStringArray元素的正确方法是什么?
答案 0 :(得分: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 );
}