AfxBeginThread(mtQuery, pParam, ...) 調用後,線程函數 mtQuery 內訪問 pParam 成員時崩潰/報錯。
主線程在啟動工作線程後,過早釋放/刪除了參數結構體內存。
// 主線程錯誤示例
PPARAM pParam = new PARAM; // 分配
pParam->pListBox = ...;
AfxBeginThread(mtQuery, pParam); // 異步啟動
delete pParam; // 錯誤!工作線程可能尚未讀取參數
mtQuery 結束前 delete pParam。std::shared_ptr)。UINT _cdecl mtQuery(LPVOID pParam) {
PPARAM pparam = (PPARAM)pParam;
// ... 使用 pparam 成員 ...
// 線程結束前釋放參數內存
delete pparam;
return 0;
}
// 主線程
auto params = std::make_shared();
params->pListBox = m_listBox;
params->strFtp = _T("ftp://...");
AfxBeginThread([](LPVOID p) {
auto p = static_cast*>(p);
// 使用 (*p)->member
// 共享指針離開作用域自動釋放
}, new std::shared_ptr(params)); // 傳遞 shared_ptr 指針
CListBox*) 跨線程訪問需 PostMessage 或鎖,不能直接在工作線程調用 AddString(MFC UI 非線程安全)。CInternetSession, CFtpConnection) 必須在線程內創建、使用、銷毀,不可跨線程共享。CInternetException 並通過 PostMessage 通知主線程顯示錯誤。多線程參數傳遞核心原則:**誰創建誰釋放,或明確所有權轉移**。主線程啟動線程後不可立即銷毀參數,需由工作線程在使用完畢後釋放。