退出程序,不能关闭进程

soluble   2009-3-4 11:37 楼主
WINCE 6.0, VS2005
程序是一个任务管理器,几个对话框,主要操作是CTabCtrl加载几个对话框,(对话框由dialog create),在几个dialog中分别做的是1.每隔一段时间获得CPU和内存的状态,画图 2.获得当前运行的进程,显示于列表中 3.获得当前可见的窗口,显示与列表中

现在的问题是,通过按OK,或×, 表面上程序是退出了,但它的进程还在,有内存泄漏, 但是通过关闭进程,内存都能释放掉,程序退出的干净。
查了一下内存可能泄漏的地方,觉得应该都放掉了。疑惑...达人之路!

回复评论 (9)

打开,关闭程序多次之后,可以在进程里看到存在着许多同一个进程名,可以关闭它,但同时串口也报错:
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
点赞  2009-3-4 11:47
你用Remote Tools/Remote Process Viewer 看一下,进程在么?
点赞  2009-3-4 11:52
实在不行,就掉哟个ExitProcess推出程序
点赞  2009-3-4 11:52
MFC?还是API的?退出时怎么处理的?贴代码。
点赞  2009-3-4 12:17
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和析构函数,有时候又不会调用,且有输出时都是两个一起的。调用到的时候,退出时进程也关闭了。


点赞  2009-3-4 13:16
顺便提一下申请内存的做法
         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,可以吗?
点赞  2009-3-4 14:58
没问题吧
点赞  2009-3-4 16:04
搞了半天还是以前碰到的问题:
设置控件显示文本,一般两种方法:关联一个变量,UpdateData 或是 直接SetDlgItemText 但一调用,就不行了,程序退出时不调用析构函数了,于是进程还在。

但是,独立建一个工程,也做这样的操作,却也没有这样的问题。
区别就在于:
工程一、窗口A、B, A 为主窗口,B属性为Child,B通过B.Create来创建
工程二、窗口A、B, A为主窗口, B属性为POPUP,通过DoModal来创建
难道这样真的会有影响?天哪, 咋会这样??
点赞  2009-3-4 20:33
有点乱了,于是又建了一个工程,再来,又可以了。
这个工程和以前的唯一的不同是关于定时画图,以前是通过timeSetEvent(500, 0, (LPTIMECALLBACK)TimeProc, (DWORD)this,TIME_PERIODIC | TIME_CALLBACK_FUNCTION) 创建一回调函数来实现,现在直接用OnTimer()来实现。
但现实控件文本的问题真的很奇怪,以后慢慢研究吧
点赞  2009-3-5 13:31
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复