当我们创建程序时,它在XP下正常关闭,但在Vista下,即使程序已关闭,该过程通常仍在运行,直到我打开任务管理器并手动终止该过程。
关于如何确保关闭程序时关闭此功能的任何建议?多么痛苦。
马克甘迪 www.magchat.com答案 0 :(得分:4)
调试器将成为你的朋友。一直关机,直到你遇到困难。那将是最好的选择。
但是...假设由于某种原因调试器正在影响行为,或者由于某些其他原因而无法使用:
之前的一些回复建议使用FastMM。自D2006以来,这一直是delphi的默认内存管理器。您可以尝试将选项翻转到report memory leaks ...但这只会在您关闭流程后才能工作,这是无法正常工作的。 :)所以我怀疑在这种情况下它会对你有多大帮助。 FastMM的完整版本与delphi打包的标准版本相反,可能还有一些其他有用的功能......但我不记得任何有用的内容。
要检查应用程序是否卡住,您可以尝试sysinternals tools,例如Process Explorer&进程监视器。进程监视器可能会显示它是否阻塞了任何ACCESS_DENIED错误等,以及错误时的堆栈跟踪。 Process Explorer可能特别有用,通过列出您的进程仍处于打开状态的所有句柄,并允许您查看其所有活动线程的堆栈。在任何悬挂线程的堆栈跟踪中,熟悉的一两个函数可能会向您发送正确区域中的搜索。
答案 1 :(得分:3)
您使用的是多线程吗?如果其中一个因某些原因无法终止,它将挂起清理过程。
答案 2 :(得分:3)
简短的回答是您的应用程序中存在错误。那么,你试过调试吗?
如果您在Vista上安装了Delphi IDE,请从IDE运行应用程序并在“挂起”时将其中断。有可能你有一个没有自行终止的线程,VCL正在等待它完成。
如果你没有在vista上安装IDE,你可以使用远程调试器,但我对此并不熟悉。
答案 3 :(得分:0)
您打算如何关闭您的计划?尝试使用
Application.Terminate;
强制关闭所有表单并退出进程。
答案 4 :(得分:-1)
这可能意味着您有一些内存泄漏 - 某些资源未被释放。
如果您的应用程序实例化COM对象,请检查您是否正确关闭它们。
如果使用旧版本的Delphi,可以尝试使用FastMM
查找可能的内存泄漏按要求编辑,示例:
我有两种情况,应用程序有时会在退出后驻留在内存中。两个应用程序都将从任务栏中消失,但它们仍然处于活动状态 - 在任务管理器中可见。这两个应用程序都是使用Delphi 7创建的。
第一个应用程序有一个带有面板的主窗口,其中嵌入了ather表单。每种形式都是标准的TForm。每个表单都是在用户首次请求时创建的。一切都在测试环境中没有问题,但是用户报告说,应用程序会不时地在内存中保留,通常是在长时间使用后 - 当用户在应用程序中显示几乎所有表单时。测试时我无法复制此行为。那是我第一次发现FastMM。当我第一次使用FastMM运行应用程序时,它报告主要表单中嵌入的某些表单未被释放。此版本已在用户站点进行了测试,结果发现有2个具有大量数据感知组件的表单会挂起并阻止应用程序退出。当我添加代码以确保在主窗体之前释放所有创建的表单时,应用程序永远不会在退出时挂起。
第二个例子是使用COM激活GIS编辑器(Geomedia)来操纵一些地图数据的应用程序。我导入了类型库并创建了Delphi包装器对象。应用程序结束时,某些已创建的对象未被释放。应用程序图标从任务栏消失,但应用程序和GIS编辑器仍处于活动状态且在任务管理器中可见。同样,每次应用程序运行时都不会发生这种情况。我在应用程序中包含了FastMM,它报告说某些对象没有被释放。我确保每个创建的对象都被释放,然后该应用程序不再挂起退出。
答案 5 :(得分:-4)
...如果您需要关闭单个表单,请使用:
Form.Close;
如果你需要隐藏(像Minimize,只有GUI被清除)表格,那么:
Form.Hide;
如果表单是动态的(在runetime创建),则使用:
Form.Destroy;
如果表单是动态的,您不会将它用于同一个界面,那么:
Form.Free;
此外,还有Form.FreeAndNill,但我猜它删除了所有内存和加载的处理程序,只允许在同一个界面中再次使用相同的内存空间......(我可能错了)。
P.S。我希望我写的不是错误,因为我很久很久以前读过这个理论......而且它总是关于Destructor DESTROY ...
P.P.S如果您正在编写一个支持Vista的应用程序,请务必小心 - 它包括带有清单/运行时代码和SuperBar兼容性要求的UAC处理。由于其Aero功能,Aero还需要一些额外的兆字节输出文件......:P