WINCE 6.0, VS2005
程序是一个任务管理器,几个对话框,主要操作是CTabCtrl加载几个对话框,(对话框由dialog create),在几个dialog中分别做的是1.每隔一段时间获得CPU和内存的状态,画图 2.获得当前运行的进程,显示于列表中 3.获得当前可见的窗口,显示与列表中
现在的问题是,通过按OK,或×, 表面上程序是退出了,但它的进程还在,有内存泄漏, 但是通过关闭进程,内存都能释放掉,程序退出的干净。
查了一下内存可能泄漏的地方,觉得应该都放掉了。疑惑...达人之路!
打开,关闭程序多次之后,可以在进程里看到存在着许多同一个进程名,可以关闭它,但同时串口也报错:
Exception 'Raised Exception' (-1): Thread-Id=075b0006(pth=8f3c0a14), Proc-Id=07560006(pprc=8f3c0eb4) 'CPUMon.exe', VM-active=0756000
6(pprc=8f3c0eb4) 'CPUMon.exe'
PC=4006bdfc(coredll.dll+0x0005bdfc) RA=93d264b4(kernel.dll+0x000064b4) SP=0009fe20, BVA=00000000
你用Remote Tools/Remote Process Viewer 看一下,进程在么?
to ultrapro :对话框程序,退出时按OK,对话框消失,进程还看的到。 ExitProcess加在哪里呢,析构函数里吗?
to shuiyan: 退出时删掉建的进程及对象, 放在函数OnDestroy()中
void CCurve::OnDestroy()
{
CDialog::OnDestroy();
delete m_dwCPUPer;
delete m_dwMemPer;
delete m_phyavila;
delete m_phytotal;
delete m_viravaila;
delete m_virtotal;
delete m_pageavaila;
delete m_pagetotal;
if(m_dwTimerID)
{
timeKillEvent(m_dwTimerID);
}
DeleteObject(CPURect);
DeleteObject(PhyGroupRect);
DeleteObject(ClientRect);
DeleteObject(rect_graph);
DeleteObject(rect_mem);
DeleteObject(cdc_mem);
DeleteObject(brushBlack);
DeleteObject(penGreen);
DeleteObject(penCPU);
DeleteObject(penMem);
RETAILMSG(1, (_T("ondestroy------------------------\r\n")));
}
我又在析构函数中也加了一句输出
但是奇怪的是,按OK之后,有时候会调用到OnDestroy和析构函数,有时候又不会调用,且有输出时都是两个一起的。调用到的时候,退出时进程也关闭了。
顺便提一下申请内存的做法
DWORD *m_dwCPUPer;
DWORD *m_dwMemPer;
DWORD *m_phyavila;
DWORD *m_phytotal;
DWORD *m_viravaila;
DWORD *m_virtotal;
DWORD *m_pageavaila;
DWORD *m_pagetotal;
m_dwCPUPer = new DWORD[g_cyclecount];
m_dwMemPer = new DWORD[g_cyclecount];
m_phyavila = new DWORD[g_cyclecount];
m_phytotal = new DWORD[g_cyclecount];
m_viravaila = new DWORD[g_cyclecount];
m_virtotal = new DWORD[g_cyclecount];
m_pageavaila = new DWORD[g_cyclecount];
m_pagetotal = new DWORD[g_cyclecount];
各位老大帮我看看,这样new, 直接delete,可以吗?
搞了半天还是以前碰到的问题:
设置控件显示文本,一般两种方法:关联一个变量,UpdateData 或是 直接SetDlgItemText 但一调用,就不行了,程序退出时不调用析构函数了,于是进程还在。
但是,独立建一个工程,也做这样的操作,却也没有这样的问题。
区别就在于:
工程一、窗口A、B, A 为主窗口,B属性为Child,B通过B.Create来创建
工程二、窗口A、B, A为主窗口, B属性为POPUP,通过DoModal来创建
难道这样真的会有影响?天哪, 咋会这样??
有点乱了,于是又建了一个工程,再来,又可以了。
这个工程和以前的唯一的不同是关于定时画图,以前是通过timeSetEvent(500, 0, (LPTIMECALLBACK)TimeProc, (DWORD)this,TIME_PERIODIC | TIME_CALLBACK_FUNCTION) 创建一回调函数来实现,现在直接用OnTimer()来实现。
但现实控件文本的问题真的很奇怪,以后慢慢研究吧