我这样创建了一个界面线程。
它继承于CWinThread
class CMyUIThread : public CWinThread
///// 然后我这样开启线程的:
CMyUIThread* pThread = new CMyUIThread;
pThread->CreateThread(); 然后在线程的ExitInstance里面我做了一些释放线程中资源的操作。但是我发现ExitInstance不会被调用,所以我手动发送WM_QUIT消息给线程。
pThread->PostMessage(WM_QUIT, 0, 0);
然后在ExitInstance中 我用断点跟了发现在AfxEndThread里面,他调用了pThread->Delete();
这个操作是不是已经删除了我new出来的Thread对象?我不用显式的调用delete删除了?
它继承于CWinThread
class CMyUIThread : public CWinThread
///// 然后我这样开启线程的:
CMyUIThread* pThread = new CMyUIThread;
pThread->CreateThread(); 然后在线程的ExitInstance里面我做了一些释放线程中资源的操作。但是我发现ExitInstance不会被调用,所以我手动发送WM_QUIT消息给线程。
pThread->PostMessage(WM_QUIT, 0, 0);
然后在ExitInstance中 我用断点跟了发现在AfxEndThread里面,他调用了pThread->Delete();
这个操作是不是已经删除了我new出来的Thread对象?我不用显式的调用delete删除了?
解决方案 »
- 如何禁用IE浏览器的自动修正地址功能
- MFC的编译问题
- 怎么在一个对话框中嵌套另一个对话框!!(高分)
- 请教一个编译的错误
- 再次提问!!!使用MsComm控件,如何使得一次OnComm事件中能够收到大于8个字节的内容!!!
- 如何添加删除SQL SERVER 2000中的角色与用户
- 关于文本文档的一个有趣的现象
- CArchive CMemFile
- 想要bois 原代码的进来
- 为什么自己画的鼠标光标不能用啊??本来在资源里已经给改成256色的了,但是一运行还是黑白的??
- vc中获得delphi程序中的TPanel句柄后,如何取得TPanel上的Label内容
- 继承CWinThread,然后new出来的线程是否需要delete?
你就是把所有的东西都释放了,这个线程对象没有被释放啊
delete this;
那我就不用delete了吧我想,不然就重复删除了。
CMyUIThread* pThread = new CMyUIThread; 应该对应的 delete pThread; 这是释放new出来的空间!
不然的话它自己调用Delete()以后,在我delete pThread的时候就会出异常。
还是要delete pThread
if ( pThread )
{
pThread->PostMessage(WM_QUIT, 0, 0);
WaitForSingleObject(pThread->m_hThread, INFINITE);
delete pThread;
pThread = NULL;
}在delete pThread的时候抛出异常。
我在前面设置pThread的m_bAutoDelete为false的时候就不会异常。
改成:pThread->SendMessage(WM_QUIT, 0, 0); 试试!
WaitForSingleObject(pThread->m_hThread, INFINITE); 这两句加起来和SendMessage差不多吧。它会等到线程结束的。
CloseHandle(handle);
delete pThread;
好些是CreateThread后,如果线程不用了,必须调用CloseHandle释放资源!
http://www.vczx.com/tutorial/mfc/mfc8.php
看看这个吧
引用:
CWinThread::Delete的缺省实现是:如果本线程的成员函数m_bDelete为TRUE,则调用“C”运算符号delete销毁MFC线程对象自身(delete this),这将导致线程对象的析构函数被调用。若析构函数检测线程句柄非空则调用CloseHandle关闭它。通常,让m_bDelete为TRUE以便自动地销毁线程对象,释放内存空间(MFC内存对象在堆中分配)。但是,有时候,在线程结束之后(Win32线程已经不存在)保留MFC线程对象是有用的,当然程序员自己最后要记得销毁该线程对象。
继承CWinThread的方法一般多用于UI线程,
分配线程创建窗体的时候用的,如果不是这种用途请使用工作线程。正确的做法是:
构造一个窗体类CMyDlg
//在CMyUIThread 的InitInstance函数内
BOOL CMyUIThread::InitInstance()
{
m_pMainDlg = new CMyDlg;
m_pMainDlg->Create(IDD_DIALOG_MAIN, CWnd::GetDesktopWindow());
m_pMainDlg->ShowWindow(SW_SHOW);
return TRUE;
}
//在ExitInstance()函数内
int CMyUIThread::ExitInstance()
{
if(m_pMainDlg!=NULL)
{
delete m_pMainDlg;
m_pMainDlg = NULL;
}
return CWinThread::ExitInstance();
}