CoFreeUnusedLibrariesEx对Delphi中的TTimers有何影响?

3
我们需要使用CoFreeUnusedLibrariesEx修复MSXML库使用后未清空堆的错误。详见此链接: http://blogs.msdn.com/b/marcelolr/archive/2008/11/13/msxml-heaps-not-being-released.aspx 但这会导致TTimers出现问题,需要一段时间才能显示,而当Delphi应用程序反弹后再次显示。
该应用程序使用TTimers来安排任务,如运行XML转换。
问题在于: 当调用TTimer.Enable时,它会抛出一个错误,表示没有足够的计时器可用。 我知道这是一个掩盖的错误,我必须找出如何找到实际的错误。
这是一个单线程应用程序,只有一个计时器。
我查看了以下链接: 最常见的原因似乎是无效的窗口句柄 https://groups.google.com/forum/#!topic/borland.public.delphi.winapi/UrIskaFZggU 还有其他帖子建议,操作系统的TIMERS资源耗尽了,我不确定这是否与我相关。
我只是想了解CoFreeUnusedLibrariesEx和TTimers之间的交互方式,它逐渐地以某种方式剥夺它的资源,并使我们弹出应用程序以使其工作。
我该如何解决这个问题,我正在寻找一些方向?

1
听起来你的定时器有泄漏的问题。对应用程序中的SetTimerKillTimer函数进行仪器化调用。 - David Heffernan
1
这是否意味着CoFreeUnusedLibrariesEx没有影响它,而只是一个现有的错误,因为它在那个更改之后立即出现了?让我尝试跟踪对SetTimer和KillTimer的调用,谢谢! - user3313541
很难知道发生了什么。我只是告诉你从这里听起来像什么。我的判断可能完全错误。 - David Heffernan
是的,它会。你是否无意中泄漏了定时器? - David Heffernan
很抱歉,我不熟悉这个。我该如何确定它是否泄漏...我无法查看setTimer和KillTimer,因为我们没有针对此的集成开发环境(IDE)。您能否指向一个链接?我找不到一个事件监听器,以便在调用SetTimer或KillTimer时通知我。 - user3313541
显示剩余3条评论
1个回答

1
CoFreeUnusedLibrariesEx不应影响TTimers。但如果加载和卸载(有缺陷的)dll泄漏任何用户对象(包括计时器,窗口句柄等),那么您可能会用尽用户对象。
使用Windows任务管理器,并将其配置为在“进程”选项卡中显示“用户对象”。然后比较调用CoFreeUnusedLibrariesEx时的用户对象数量和不调用CoFreeUnusedLibrariesEx时的用户对象数量。

好的,让我试一下,试完后会回复你。 - user3313541
我尝试了一下,在调用CoFreeUnusedLibrariesEx后,UserObjects会上升,如果不使用它,UserObjects会恢复正常,但是使用CoFreeUnusedLibrariesEx时,APP使用的UserObjects总是会增加。这个调用是如何消耗用户对象的? - user3313541
嗯...看起来你可能已经回答过了。加载和卸载有漏洞的 dll 导致了这个问题。我该怎么解决这种情况?找出有缺陷的 dll 中的泄漏在哪里? - user3313541
如果您可以通过LoadLibrary和UnloadLibrary复现泄漏,那么泄漏必须在dll的dllmain中(或者在Delphi中的初始化/终止)的某个地方。很可能是dll在初始化中做了一些“可怕”的事情。如果您没有dll的源代码,则需要向该dll的创建者提出修复其代码的要求。 - Sebastian Z
我会接受这个作为答案,因为我想要理解发生了什么,这对我来说是一个合理的解释。 - user3313541

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接