【问题标题】:Long running VBA macros are interrupted by svchost.exe长时间运行的 VBA 宏被 svchost.exe 中断
【发布时间】:2020-06-02 20:31:43
【问题描述】:

我有一些运行数小时的 Excel VBA 宏。宏执行数百万次 COM 调用以从 CAD 应用程序获取一些信息,处理一些数字,然后对同一个 CAD 应用程序进行其他数百万次 COM 调用以创建一些绘图。宏每秒将状态和进度写入文本文件。

我有一个 Python 进程,它检查进度文件是否在最后几秒钟内更新,如果不是,它将杀死 Excel 和 CAD 并通知失败。

问题是,每隔 10 或 20 分钟,我会在任务管理器中看到一个 svchost.exe 进程,它会在几秒钟内占用 100% 的内核,Excel CPU 使用率下降到零,并且大多数(不是全部)应用程序变为没有反应。当 svchost.exe 回到 0% 时,Excel 重新开始运行并继续其工作。

多年来,一切都运行良好,但最近我们开始处理更大的绘图,并且 svchost.exe 开始让 Excel 成为人质的时间越来越长。

我将超时时间从 20 秒增加到 40 秒,然后增加到 60 秒。但我只是有几个实例,其中 svchost.exe 需要超过一分钟才能完成它的工作。

如果我右键单击任务管理器上的 svchost.exe 进程,然后在“转到服务”上,我会看到两个突出显示的服务:“RPC 端点映射器”和“远程过程调用 (RPC)”。

我尝试每 10 秒添加一个 3 秒的暂停,希望 svchost.exe 能利用空闲时间,但没有帮助。

暂停似乎发生在随机时刻,通常是当 Excel 将数据加载到大型集合中时,有时是 2 到 3 次,同时集合的大小会增加,或者当大型集合超出范围时。

我不喜欢在不知道原因和什么是好的值的情况下增加超时。

有没有办法避免这些长时间的停顿?

【问题讨论】:

  • (1) 为什么是近距离投票? (2) 为什么不发表评论就投票结束?

标签: excel vba windows com


【解决方案1】:

现在是考虑将 Excel 用于长时间运行的进程的限制的好时机。

在没有看到代码的情况下,我只能推测 COM 调用的处理方式存在内存泄漏。也许即使使用 Set = Nothing 也没有正确处理对象?

您能否考虑用 Python 或 VB.Net 重新编写程序并利用更有效的故障排除/应用程序设计功能?

我不认为 svchost.exe 与崩溃有任何关系,它可能是 COM 对象的 DLL 接口的代表或症状?但在不知道使用什么 DLL 和对象的情况下不确定。

【讨论】:

  • 我很想用 Python 重写它,但它是一个有 20 年历史的宏,增长到 60,000 行;重写它需要几个月的时间。不能这样做Set = Nothing,因为我正在将对象添加到大型集合中,以便在 VBA 中一次进行排序、处理和处置。 svchost.exe 并不会真正导致崩溃,它会在将控制权归还之前将计算机作为人质 60 多秒。将一个 60 秒的停顿减少到 10 个 6 秒的停顿对我来说是一个很好的解决方案。
  • 有没有办法控制输入?听起来它在对象“更小”但最近您将输入“更大”时起作用。
  • 一个 20 年前的 Excel 宏,哇。也许有几个操作系统和 Excel 变化?至于 svchost,你会觉得它什么都用,什么都没有。似乎有很多被管理的对象。如果它们存在于集合中,也许可以使用循环。我想知道是否可以在没有问题的情况下在运行时保存宏的状态,然后使用保存的状态重新启动整个过程。但老实说,我不知道实现会有多复杂,也不知道所有要保存的参数的知识是否可用。
  • @Zwenn COM 对象的集合越大,svchosts.exe 的暂停时间就越长。较小的集合可以工作,因为 svchosts.exe 只占用几秒钟。我无法预测 svchosts.exe 何时启动,我没有注意到任何模式。我可以只保留 VBA 变量和 CAD 实体的 ID,而不是保留包含一些 VBA 本机变量和一些 COM 对象的集合,然后在以后需要它们时检索它们。这将使整个工作所需的时间增加一倍以上,但可能会解决我的问题。
  • “处理较大的图纸”似乎是解决您问题的关键,您能否将图纸的输入数据分成四份并在不同的机器上运行 4 个不同的 Excel 应用程序?如果绘图是二进制数据或坐标,这可以工作。
猜你喜欢
  • 2016-11-20
  • 1970-01-01
  • 2018-04-07
  • 2022-12-12
  • 1970-01-01
  • 2013-12-10
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多