Excel 长时间运行的VBA宏被svchost.exe中断

Excel 长时间运行的VBA宏被svchost.exe中断,excel,vba,windows,com,Excel,Vba,Windows,Com,我有一些Excel VBA宏可以运行几个小时。宏执行数百万次COM调用以从CAD应用程序获取一些信息,处理一些数字,然后对同一CAD应用程序执行其他数百万次COM调用以创建一些图形。宏每秒在文本文件上写入状态和进度 我有一个Python进程,它检查进度文件是否在最近几秒钟内更新过,如果没有,它将杀死Excel和CAD并通知失败 问题是,每10或20分钟,我就会在任务管理器中看到一个svchost.exe进程,它占用100%的内核几秒钟,Excel CPU使用率降至零,并且大多数(并非所有)应用程

我有一些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次,或者大型集合超出范围时暂停

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


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

< P>这是考虑使用Excel进行长时间运行的限制的好时机。

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

您可以考虑在Python或VB.NET中重新编写程序,并利用更有效的故障排除/应用程序设计特点吗?p>


我认为svchost.exe与崩溃无关,它可能是COM对象DLL接口的代表性或症状?但在不知道使用了哪些DLL和对象的情况下,无法确切确定。

(1)为什么投票结果接近?(2) 为什么你会投票赞成结束而不留下评论呢?我很想用Python重写它,但它是一个有20年历史的宏,可以长到60000行;重写它需要几个月的时间。无法执行
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应用程序?如果图形是二进制数据或坐标,这可能会起作用。