Memory Delphi5应用程序部分加载到任务管理器中,实际显示需要花费很长时间

Memory Delphi5应用程序部分加载到任务管理器中,实际显示需要花费很长时间,memory,delphi-5,taskmanager,Memory,Delphi 5,Taskmanager,我有一个用Delphi5编写的应用程序,它在大多数(windows)计算机上运行良好 但是,有时程序开始加载(您可以在任务管理器中看到它,使用大约2.5-3 MB的内存),但随后会暂停数分钟,有时是数小时 如果您将其保留足够长的时间,formshow事件最终将发生,应用程序窗口将弹出,但似乎其他应用程序或windows设置正在阻止它最初使用运行所需的所有内存(约35-40 MB) 另外,在我客户的一些工作站上,如果他们运行MS Outlook,他们可以关闭它,然后弹出我的应用程序。有人知道这里发

我有一个用Delphi5编写的应用程序,它在大多数(windows)计算机上运行良好

但是,有时程序开始加载(您可以在任务管理器中看到它,使用大约2.5-3 MB的内存),但随后会暂停数分钟,有时是数小时

如果您将其保留足够长的时间,formshow事件最终将发生,应用程序窗口将弹出,但似乎其他应用程序或windows设置正在阻止它最初使用运行所需的所有内存(约35-40 MB)


另外,在我客户的一些工作站上,如果他们运行MS Outlook,他们可以关闭它,然后弹出我的应用程序。有人知道这里发生了什么,和/或如何解决它吗?

既然没有人给出更好的答案,我想尝试一下如何解决这个问题:

你的初始化中有某种东西不知怎么地把它锁起来了。没有看到您的代码,我不知道它是什么,因此我只介绍如何查找它:

您需要记录在启动期间完成的工作。如果您有任何类型的屏幕显示,我发现窗口标题对此很有用,但听起来好像没有——这意味着您需要将日志写入一个文件。让它消失,结束任务,看看它去了哪里

请注意,这意味着您需要干净地写入数据,尽管程序异常终止。如何做到这一点:

A) 追加,写下你的行,结束

B) 写下行,然后刷新文件句柄

C) 最初,将文件写入由大量空格组成的文件——确保这比实际日志要大。写下你的台词。在异常终止的情况下,它将保留原来较大的文件大小

我会在每个日志项上写一个时间戳,这样您就可以看到它是否只是处理速度太慢

如果检查日志可以告诉您问题所在,则可以。如果,像通常发生的那样,在最后一个被记录的项目和下一个没有被记录的项目之间多做一点记录是不够的——我知道,在寻找一个只发生在别人系统上的神秘问题时,会记录每一行

如果查找行不足以查明问题,还可以转储相关变量的值


最后,如果如此严格的审查使bug消失,那么就开始寻找未初始化的变量。(虽然内存消耗也是一种选择,但我怀疑这是罪魁祸首。)

获取Process Explorer的副本,启动Delphi 5应用程序,然后查找正在消耗的资源!若你们的应用程序刚开始运行时需要40MB,那个么你们在启动时一次使用的资源就太多了。如果表单只需要几分钟/几个小时就可以显示出来,那么要么是UI太复杂,控件太多,要么是主线程代码在执行本来不应该执行的操作时死锁。不管怎样,如果你的应用程序遇到了这些问题,那么它的设计就不是很好。@RemyLebeau一个程序可能需要这种内存,而不会做任何不合理的事情。我已经编写了一些代码,其中第一个初始化操作是分配一个64mb的数据结构。预先计算一堆东西需要几秒钟,这是获得可接受性能的唯一方法。此外,请注意,他的代码在大多数系统上都起作用。@LorenPechtel:因为它看起来确实是环保的,这仍然向我表明,“主线程做了一些它本来不应该做的事情”是可能的罪魁祸首,而“某些事情”在不同的机器上表现不同。@RemyLebeau我只是在解决内存问题——有时候你需要这么多而不做坏事。我确实认为这是僵局。