当前位置:编程学习 > C#/ASP.NET >>

多线程退出,内存泄漏

本项目是多线程处理的,正常退出(用控件控制停止向线程往界面报告状态,然后把再点击关闭)是没有问题的。如果其他线程还一直在向界面报告状态(GetItemText、SetItemText)的话,此时点击右上角的关闭,就会造成内存泄漏。
  现在我测试了一下,发现往界面报告状态的线程无法退出(停在GetItemText、SetItemText函数上),我重写了OnClose,在里面等待其他线程执行完退出,但一直没能退出。
:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278780} normal block at 0x02AC4428, 273 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 00 01 00 00 01 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278774} normal block at 0x02AC43D8, 20 bytes long.
 Data: <T vQ            > 54 CD 76 51 03 00 00 00 03 00 00 00 01 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278771} normal block at 0x02AC4380, 21 bytes long.
 Data: <T vQ            > 54 CD 76 51 04 00 00 00 04 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278770} normal block at 0x02AC4330, 19 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278769} normal block at 0x02AC42E0, 19 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278768} normal block at 0x02AC4290, 19 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278767} normal block at 0x02AC4240, 19 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278766} normal block at 0x02AC41F0, 19 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278765} normal block at 0x02AC41A0, 19 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278764} normal block at 0x02AC4150, 19 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278763} normal block at 0x02AC4100, 19 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278762} normal block at 0x02AC40B0, 20 bytes long.
 Data: <T vQ            > 54 CD 76 51 03 00 00 00 03 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278761} normal block at 0x02AC4060, 18 bytes long.
 Data: <T vQ            > 54 CD 76 51 01 00 00 00 01 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278760} normal block at 0x02AC3F60, 23 bytes long.
 Data: <T vQ            > 54 CD 76 51 06 00 00 00 06 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(156) : {278759} normal block at 0x02AC3F10, 19 bytes long.
 Data: <T vQ            > 54 CD 76 51 02 00 00 00 02 00 00 00 02 00 00 00 
f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\strcore.cpp(188) : {278758} normal block at 0x02AC4000, 30 bytes long.
 Data: <T vQ            > 54 CD 76 51 0C 00 00 00 0D 00 00 00 03 00 00 00 
{838} client block at 0x001DE180, subtype c0, 212 bytes long.

点击了右上角的关闭之后,主线程是怎样处理的呢?为什么用GetItemText、SetItemText都执行不了,无法继续下去。
我应该怎样解决这个问题呢? 内存泄漏 多线程 关闭退出 OnClose ON_WM_CLOSE --------------------编程问答-------------------- 若确认是退出时的内存泄漏,那没关系的,
反正程序一退出,所用内存系统会全部回收的。
--------------------编程问答--------------------
引用 1 楼 rtdb 的回复:
若确认是退出时的内存泄漏,那没关系的,
反正程序一退出,所用内存系统会全部回收的。

虽然说这个问题也不大,但总是一个缺陷,需要找解决方法的 --------------------编程问答-------------------- 点击右上角的关闭,会导致UI先关闭,所以GetItemText、SetItemText这些UI操作就无效了。
主线程加多一个退出标志吧,在UI的Onclosing时置位,
其他线程访问UI时先判断此标志。
--------------------编程问答-------------------- 我也经常遇到,mark --------------------编程问答-------------------- 有些内存泄露能避免,有些不能。 --------------------编程问答-------------------- Mark 
有内存泄漏软件,但是我也用不好 --------------------编程问答-------------------- 请问楼主问题解决了么?我现在也是这个问题。 --------------------编程问答-------------------- 在点击关闭的地方加个断点。实在不行观察当时计算机所有程序。 --------------------编程问答-------------------- 加断电到程序段,
不然你可以用 逐行调试
随时观看,局部变量,和输出 重的值

如果实在不可以解决可以用c++
try{}catch(...){}错误处理屏蔽试试 --------------------编程问答-------------------- try catch 这够损的。
补充:.NET技术 ,  VC.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,