小弟新建了一个MFC对话框工程,在类中添加了静态函数:
static UINT CALLBACK ThreadProc(LPVOID);
一个线程指针:
CWinThread* pThread;
一个全局变量用于控制线程退出:
static BOOL bClose;对话框在初始化时,添加如下代码:
bClose=false;
pThread=new CWinThread;
析构函数的代码如下:
CMThreadDlg::~CMThreadDlg()
{
bClose=true;
WaitForSingleObject(pThread->m_hThread,INFINITE);
if(pThread)
delete pThread;
}
当单击按钮时,启动线程:
pThread=AfxBeginThread(AFX_THREADPROC(ThreadProc),NULL);
pThread->m_bAutoDelete=false;
线程函数体如下:
UINT CMThreadDlg::ThreadProc(LPVOID parm)
{
int a=0;
while(!bClose)
{
a++;
}
AfxEndThread(500);
return 0;
}
请问各位大侠,当线程运行之后,关闭对话框,如何防止内存泄露。
static UINT CALLBACK ThreadProc(LPVOID);
一个线程指针:
CWinThread* pThread;
一个全局变量用于控制线程退出:
static BOOL bClose;对话框在初始化时,添加如下代码:
bClose=false;
pThread=new CWinThread;
析构函数的代码如下:
CMThreadDlg::~CMThreadDlg()
{
bClose=true;
WaitForSingleObject(pThread->m_hThread,INFINITE);
if(pThread)
delete pThread;
}
当单击按钮时,启动线程:
pThread=AfxBeginThread(AFX_THREADPROC(ThreadProc),NULL);
pThread->m_bAutoDelete=false;
线程函数体如下:
UINT CMThreadDlg::ThreadProc(LPVOID parm)
{
int a=0;
while(!bClose)
{
a++;
}
AfxEndThread(500);
return 0;
}
请问各位大侠,当线程运行之后,关闭对话框,如何防止内存泄露。
解决方案 »
- 知道socket句柄,怎么得到源IP\Port和目的IP\Port
- 《windows程序设计》:如何在记事本的边框上显示文字和时间?
- radio button(进来的都有分加)
- 视图布局问题
- 网络传输语音的回音消除问题
- 100分,简单问题求懂的人
- 我想在我的 com 中返回我自定义的HRESULT 值,并且能让调用它的程序认识该怎么做??
- 在线等待,如何在VC界面中插入excel表。谁有记费系统界面的源代码。
- 怎样完全关闭子对话框?
- 关于VGA编程,请问VGA端口资料哪有下。我的E_MAIL:[email protected] 先谢啦。
- 程序会在Carchive::>>strResc运行不下去了,挂起了,为什么?
- ADO:可否通过数字索引0、1、2来取得fields中的field对象?
首先,你的变量 bClose要这样声明
static volatile BOOL bClose= false ;(volatile 和static 的顺序lz在好好确定一下 )否则很可能代码优化后这个变量失效 ~~
其次,pThread=AfxBeginThread(AFX_THREADPROC(ThreadProc),NULL);
pThread-> m_bAutoDelete=false;
的顺序最好交换或者先暂停线程,设置好所有选项后再启动线程,这是一种好习惯!
最后,AfxEndThread(500);的调用好象有点多余吧,直接return 500不就好了吗?
至于内存为什么会泄露,我建议lz还是好好查看其他地方吧,单从线程来看应该没有问题的,Debug窗口应该有提示的啊我对MFC不是很熟悉,反正没有什么好感,还是Win32 API直接 ,delphi和C++ Builder用的VCL都比MFC高明很多~~
在对话框类里添加变量:protected:
CWinThread* m_pUIThread;
HANDLE handle;添加回调函数声明:static UINT CALLBACK ThreadProc(LPVOID lParam);添加全局变量:static volatile BOOL bClose;在对话框实现体中添加按钮单击消息体,回调函数体和析构函数:void CMyThreadDlg::OnButton1()
{
bClose=false;
m_pUIThread=AfxBeginThread(AFX_THREADPROC(ThreadProc),THREAD_PRIORITY_NORMAL,0,CREATE_SUSPENDED,NULL);
handle=m_pUIThread->m_hThread;
m_pUIThread->ResumeThread();
}
UINT CMyThreadDlg::ThreadProc(LPVOID lParam)
{
int a=0;
while(!bClose)
{
a++;
}
return 500; }
CMyThreadDlg::~CMyThreadDlg()
{
bClose=true;
if(WaitForSingleObject(handle,0)==WAIT_TIMEOUT)
{
WaitForSingleObject(handle,INFINITE);
}
}