请教一个线程调用,内存增加的问题

mylinus 2007-02-08 10:27:50
是这样的,我做一个监控系统时遇到内存泄露的问题.

我用定时器定时取一些系统的数据,在定时器OnTimer函数开了一个线程

AfxBeginThread(ServerCPUThreadProc,GetSafeHwnd(), THREAD_PRIORITY_NORMAL);

然后在ServerCPUThreadProc函数中什么都不运行,内存也会增加(4k的增长率),这是为什么?

如果我把定时器的线程的代码去掉,内存就不会增加
...全文
283 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mylinus 2007-02-14
  • 打赏
  • 举报
回复
谢谢!好像前面的代码是线程间通讯用的吧?
ATField 2007-02-09
  • 打赏
  • 举报
回复
HANDLE hEvent = ::CreateEvent("_WaitEventName",TRUE,NULL,FALSE);
WaitForSinganlObject(hEvent,INFINITE);
CloseHandle(hEvent);
这段代码是创建/打开名为_WaitEventName的Event(貌似函数参数顺序错了),然后无限等待直到hEvent被设置为止。问题是其他线程有否设置hEvent?如果没有的话那么这个线程就永远不会结束了,内存自然就有泄漏。
mylinus 2007-02-09
  • 打赏
  • 举报
回复
如果不开一个线程来采集数据,它就会跟主程序(比如弹出菜单)等功能发生抢CPU的现象,当点击托盘的图标菜单时很久才会弹出来.所以不得不出个线程让它去采集而不与主线程抢CPU
wildmen 2007-02-09
  • 打赏
  • 举报
回复
纳闷了,既然是定时器,为什么又还要开个线程?
mylinus 2007-02-09
  • 打赏
  • 举报
回复
HANDLE hEvent = ::CreateEvent("_WaitEventName",TRUE,NULL,FALSE);
WaitForSinganlObject(hEvent,INFINITE);
CloseHandle(hEvent);
这些函数在线程里有什么用.是不是要通过CloseHandle(hEvent);来关闭线程的资源?

这里有没有人知道?能不能准时放假就靠你们了
mylinus 2007-02-08
  • 打赏
  • 举报
回复
因为程序是隔一段时间采集数据,内存有升有跌.也不是一直增加,有时会回落.

但过几个小时再去看就是总的增加了些许内存.
mylinus 2007-02-08
  • 打赏
  • 举报
回复
我在线程的部分改成
m_pCPUThread = AfxBeginThread(ServerCPUThreadProc,GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
m_pCPUThread->m_bAutoDelete = TRUE;

在监听某类服务器(它只监听基本的电脑信息)时内存没有增加.四个钟(在正式环境相当于三天)时间内增加了4k.基本上认为不增长内存了.

但监听另一类的服务器(它调用的其它的DLL或服务比较多),它增加的内存有1M左右.

能分析出什么问题吗?有某种策略吗?比如自动重启
pkrobbie 2007-02-08
  • 打赏
  • 举报
回复
线程本身要占内存空间,AfxBeginThread会创建内部对象。
关键是你的线程是否正确的释放了。
mylinus 2007-02-08
  • 打赏
  • 举报
回复
在线等待,快过年了,碰到这事,真麻烦!

我把代码一个一个的拆就是为了找出内存泄漏点,结果创建线程的时候

不知是什么没有释放掉?请教各位
ATField 2007-02-08
  • 打赏
  • 举报
回复
内存会一直增加吗?有可能你看到的内存增加只是暂时现象,只是表明程序的Working Set增加,系统发现你占用的内存增加所以就跟你多“分配”一点内存,即使你不会用到,这样下次你要用到的时候速度会快一些。建议你把增长的曲线画出来,看是否是一直在增加。
mylinus 2007-02-08
  • 打赏
  • 举报
回复
AfxBeginThread产生的对象不是可以自动删除的吗?
如果照我的情况,该怎么来改善代码?
mylinus 2007-02-08
  • 打赏
  • 举报
回复
谢谢各位.那该怎么做才好?
LiALan 2007-02-08
  • 打赏
  • 举报
回复
把创建线程的操作放在OnTimer函数中的做法很少见,每执行一次OnTimer函数就有一个新线程创建出来,线程属于内核对象,即使线程函数什么都不做,线程也会消耗一定的资源。

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧