我從一個UI事件(單獨的類)開始一個工作線程(寫在一個新的類中)。現在,當新的工作線程從主UI線程創建時,它立即從控件返回,這導致工作線程類對象被銷燬。通過檢查下面的代碼可以找到更好的解釋。C++多線程對象超出範圍
//class - UI
void CUIClass::button_click()
{
CDataProcess obj;
obj.Start();
}
//class - DataProcess
CDataProcess::CDataProcess()
{
}
CDataProcess::~CDataProcess()
{
}
void CDataProcess::Start()
{
CWinThread *pThread = AfxBeginThread(DataProcessingThread, this);
}
UINT CDataProcess::DataProcessingThread()
{
//some processing
}
現在的一些可能的解決方案我想到的是:
- 使 'CDataProcess OBJ;'一個UI類的成員,所以它不會超出範圍。但我有目的地保留它。
- 在UI類button_event()中使用WaitForSignleObject來等待工作線程完成信號或在工作類中寫入等待函數。
還有什麼是正確的解決方案?
確保CDataProcess實例超出線程是您的責任。把它作爲局部變量是沒有意義的。無論您在「保持本地」時想到什麼目的,您都必須重新考慮。阻塞UI線程,直到工作線程完成完全失敗了讓工作線程放在第一位的目的;如果你願意這樣做(並讓UI凍結),只需在UI線程上做同樣的工作就可以開始。 –
您可以使用':: WaitForSingleObject(pThread-> m_hThread,INFINITE);'在主線程中等待您的工作線程。 – gomons
OT:除非你需要MFC中特定的東西,否則你總是可以使用['std :: thread'](http://en.cppreference.com/w/cpp/thread/thread)VS2013支持 – Mgetz