我看MSDN上说:“默认情况下,当 CWinThread 线程终止时,删除该线程对象。这意味着不能访问 m_hThread 数据成员,因为 CWinThread 对象不再存在。若要避免出现这种情况,请执行以下操作之一:
将 m_bAutoDelete 数据成员设置为 FALSE。这使 CWinThread 对象在线程终止后仍可以继续存在。然后可以在线程终止后,访问 m_hThread 数据成员。但是,如果使用此方法,就得销毁 CWinThread 对象,因为框架不会自动删除该对象。这是首选方法。 ”我写了一个简单的例子:
UINT ThreadFuncTest(LPVOID p)
{
for(int i=0;i<1000;i++)
{
;
}
return 0;
}void CButtonDlg::OnButton1()
{
CWinThread * pThread = AfxBeginThread(ThreadFuncTest, NULL);
Sleep(5000);
DWORD exitcode;
if(!GetExitCodeThread(pThread->m_hThread, &exitcode))
{
if(pThread == NULL)
{
AfxMessageBox("null");
}
else
{
AfxMessageBox("not null");
}
}
}
结果报 not null。既然线程对象已被删除,为何pThread 不是NULL?另外,我看THRDCORE.CPP里面:
void CWinThread::Delete()
{
// delete thread if it is auto-deleting
if (m_bAutoDelete)
delete this;
}
也说明默认是被delete的啊。请大侠指教!
将 m_bAutoDelete 数据成员设置为 FALSE。这使 CWinThread 对象在线程终止后仍可以继续存在。然后可以在线程终止后,访问 m_hThread 数据成员。但是,如果使用此方法,就得销毁 CWinThread 对象,因为框架不会自动删除该对象。这是首选方法。 ”我写了一个简单的例子:
UINT ThreadFuncTest(LPVOID p)
{
for(int i=0;i<1000;i++)
{
;
}
return 0;
}void CButtonDlg::OnButton1()
{
CWinThread * pThread = AfxBeginThread(ThreadFuncTest, NULL);
Sleep(5000);
DWORD exitcode;
if(!GetExitCodeThread(pThread->m_hThread, &exitcode))
{
if(pThread == NULL)
{
AfxMessageBox("null");
}
else
{
AfxMessageBox("not null");
}
}
}
结果报 not null。既然线程对象已被删除,为何pThread 不是NULL?另外,我看THRDCORE.CPP里面:
void CWinThread::Delete()
{
// delete thread if it is auto-deleting
if (m_bAutoDelete)
delete this;
}
也说明默认是被delete的啊。请大侠指教!
这个需要你自己重新设置 为NULL 的
===============
CWinThread被删除了,并不代表指针被置为NULL了,就像下面的代码:
char *p=new char;
delete p;
此时p已经被删除,不能访问了。但是p并不等于NULL