清理CWinThread對象的責任取決於它的m_bAutoDelete值。默認是刪除自己。對於火和忘記短線程這很好。它會自行清理。
如果您的線程長時間運行並需要被告知是時候退出或以其他方式進行交互,您需要CWinThread句柄保持有效並且不指向自我刪除的對象。
如果將m_bAutoDelete設置爲FALSE,則聲明您有責任刪除它。爲了使用返回的指針安全地播放它,您應該創建暫停並將其設置爲FALSE,然後再按Joseph Newcomer在其文章Using Worker Threads中所建議的方式進行恢復。
thread = AfxBeginThread(proc, this,
THREAD_PRIORITY_NORMAL, // default: use it
0, // default stack size
CREATE_SUSPENDED); // let us set auto delete
if(thread) { // protect against that rare NULL return
thread->m_bAutoDelete = FALSE;
thread->ResumeThread();
}
來源
2015-05-13 21:33:03
jla
這個答案是錯誤的。線程終止後,'CWinThread'將關閉線程句柄,並刪除它自己。因此,這段代碼可能會在一個關閉的句柄上調用'WaitForSingleObject',這是未定義的行爲,或者它可能試圖刪除一個已經被刪除的對象。正確的做法是在_suspended_線程上使用'm_bAutoDelete',正如@jla的回答中所解釋的。 – 2016-01-05 02:49:48