我有一个想要持续运行的程序。按照我现在的编码方式,一旦它到达其函数的末尾,它就会调用自身;它实际上从未到达其“结束子行”。
Sub run
*Run all code here*
Call run
End Sub
对此提出了疑问,担心该程序永远没有机会“弹出”所有已“推”到它上面的东西。基本上,一段时间后不断的自调用会使cpu过载。建议的替代方案是使用一个永远不会结束的 while 循环,本质上
Sub run
While program_run = true then
*Run all code here*
Loop
End Sub
永远不要让program_run = false。
我用“外行语”表达了一些内容,因为我不确定正确的技术术语。
我熟悉列表和数据结构上下文中的术语“pop”和“push”,但仅限于基础水平;我认为这些具体术语不适用于这种情况,但我就是这么说的。 (该程序下载 .csv 并执行一系列数据操作,即格式化、复制/粘贴、上传到 MySQL 等)
这也与确保硬件不会稳定过载有关,因此如果这在 super 用户中更合适,我理解。
问题:
对程序/硬件“重载”的担忧是否合理?
自调用模块和永不结束的 while 循环之间有什么实际区别吗?
感谢您提前提供的任何帮助!
最佳答案
1。对程序/硬件将“重载”的担忧是否合理?
取决于你所说的“重载”是什么意思。根据您的具体代码,这可能会导致一个处理器连续运行并因此升温。但计算机通常被设计为能够处理这个问题,只要不阻碍其通风,就不会造成问题。不过,它可能会很快耗尽笔记本电脑的电池。所有这些实际上取决于您的代码到底在做什么。
至于“程序重载”,我不知道这意味着什么,但它确实很好地引出了你的第二个问题:
2。自调用模块和永不结束的 while 循环之间有什么实际区别吗?
是的,有区别。既然您在 stackoverflow.com 上询问这个问题,您就会有兴趣知道您的第一段代码(自调用过程)实际上会导致 stack overflow 。您没有“使 CPU 过载”,而是耗尽了调用堆栈上的可用内存。这个内存量不是无限的,但是每次您无限次调用 run
过程时,都会占用更多的内存,所以是的,在某些时候您会用完并得到一个堆栈溢出。
至于你的第二段代码,它将无法编译。 (While ... then ... Loop
在 VBA 中不存在。您混淆了三种不同类型的语法。)
如果您绝对确定希望程序运行到时间结束(就您的计算机而言),那么您可以像这样进行无限循环:
Sub run()
Do
'*Run all code here*
Loop
End Sub
但是,您不太可能真的希望代码一直运行到时间结束。我会问自己一个合理的最终条件是什么,然后实现它。
Sub run()
Dim endConditionReached As Boolean
endConditionReached = False
Do While Not endConditionReached
'*Run all code here*
' code sets endConditionReached to True when appropriate
Loop
End Sub
关于excel - 循环程序-在其内部调用模块是一个坏主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9300421/