Vista下Delphi应用程序的关闭过程

时间:2009-07-08 12:19:12

标签: delphi windows-vista

当我们创建程序时,它在XP下正常关闭,但在Vista下,即使程序已关闭,该过程通常仍在运行,直到我打开任务管理器并手动终止该过程。

关于如何确保关闭程序时关闭此功能的任何建议?多么痛苦。

马克甘迪 www.magchat.com

6 个答案:

答案 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创建的。

  1. 第一个应用程序有一个带有面板的主窗口,其中嵌入了ather表单。每种形式都是标准的TForm。每个表单都是在用户首次请求时创建的。一切都在测试环境中没有问题,但是用户报告说,应用程序会不时地在内存中保留,通常是在长时间使用后 - 当用户在应用程序中显示几乎所有表单时。测试时我无法复制此行为。那是我第一次发现FastMM。当我第一次使用FastMM运行应用程序时,它报告主要表单中嵌入的某些表单未被释放。此版本已在用户站点进行了测试,结果发现有2个具有大量数据感知组件的表单会挂起并阻止应用程序退出。当我添加代码以确保在主窗体之前释放所有创建的表单时,应用程序永远不会在退出时挂起。

  2. 第二个例子是使用COM激活GIS编辑器(Geomedia)来操纵一些地图数据的应用程序。我导入了类型库并创建了Delphi包装器对象。应用程序结束时,某些已创建的对象未被释放。应用程序图标从任务栏消失,但应用程序和GIS编辑器仍处于活动状态且在任务管理器中可见。同样,每次应用程序运行时都不会发生这种情况。我在应用程序中包含了FastMM,它报告说某些对象没有被释放。我确保每个创建的对象都被释放,然后该应用程序不再挂起退出。

答案 5 :(得分:-4)

...如果您需要关闭单个表单,请使用:

Form.Close; 
  • GUI和HANDLER删除。提供参考和内存的某些部分以提供对变量,常量等的访问。

如果你需要隐藏(像Minimize,只有GUI被清除)表格,那么:

Form.Hide;
  • 清除GUI,使内部资源保持不变(引用,处理程序,内存)

如果表单是动态的(在runetime创建),则使用:

Form.Destroy;
  • 所有资源都将从MEMORY中删除,并附上参考和处理程序,以便您可以访问其在内存中的位置。

如果表单是动态的,您不会将它用于同一个界面,那么:

Form.Free;
  • 所有资源,参考资料,处理人员均已删除。我建议将此用于VCL TComponent类,而不是用于TForm类。

此外,还有Form.FreeAndNill,但我猜它删除了所有内存和加载的处理程序,只允许在同一个界面中再次使用相同的内存空间......(我可能错了)。

P.S。我希望我写的不是错误,因为我很久很久以前读过这个理论......而且它总是关于Destructor DESTROY ...

P.P.S如果您正在编写一个支持Vista的应用程序,请务必小心 - 它包括带有清单/运行时代码和SuperBar兼容性要求的UAC处理。由于其Aero功能,Aero还需要一些额外的兆​​字节输出文件......:P