2014-12-19 37 views
-1

我已經定義的螺紋爲:MFC:從刪除輸入指針到它ControllingFunction停止線程

​​

與DoIt_ThreadProcm定義爲:

UINT CMyClass ::DoIt_ThreadProc(LPVOID pData) 
{ 
    CMyClass * self = (CMyClass *)pData; 
    self->DoIt(); 
    return 0; 
} 

後的線程是顯然的pData被破壞完了。有沒有辦法阻止這個指針不被銷燬?我們可以定義/覆蓋mfc線程的析構函數嗎?

這是從我以前的question分支。另外我覺得這個論壇也有聯繫post

+0

你確定第一個代碼片段中的this'能夠存活很長時間嗎?沒有什麼東西能夠在你的第二天銷燬pData(除非'DoIt'確實如此),你可能沒有找到正確的方向。 – Mat 2014-12-19 11:29:53

回答

1

pData不是螺紋結束時被破壞。它被線程函數視爲一個指向void的指針,您可以將它轉換爲任何您需要/應該將數據傳遞給線程的任何東西。但是線程不會對內存pData指向任何內容,也不會與此內存中的對象指向任何內容。

實際上的唯一的事情就可以做的是釋放內存(有delete),但是這使得假設內存與new分配,而這種假設可能是假的。幸運的是MFC不做這個假設,並且不釋放內存。

析構函數調用將是完全不可能的,因爲沒有信息pData指向哪個對象 - 它是void*。沒有析構函數被調用。你的問題必須由其他事情引起。

+0

我明白了,好點。現在只是想知道...... m_bAutoDelete = false的意思,只是爲了保持指針和句柄完成線程?一般來說,沒有類似於線程的解構器的概念嗎? – ShS 2014-12-20 00:07:24

+0

'm_bAutoDelete'是'CWinThread'類的成員,它是線程的MFC包裝器。它控制'CWinThread'對象的生命週期,它與'pData'無關。 – 2014-12-20 01:11:53

+0

是的,我確實在弄清楚我的代碼存在問題。這是由於消息泵忙於等待任務而無法響應。所以這個新問題與上面回答的問題有關,但並不完全相關。 – ShS 2014-12-21 02:26:41