VBA定时器api内存使用情况

VBA定时器api内存使用情况,vba,excel,timer,Vba,Excel,Timer,我正在开发一个应用程序,它将工作数天,并从user32 lib中实现一个计时器,该计时器每500毫秒运行一次例程。问题是每次执行例程时,Excel应用程序所需的内存都会增加8KB 正如我所说的,我希望这个应用程序能运行几天,所以有一点是它的内存消耗太高,而这个应用程序开始太慢 我已经在这个地方和其他地方寻找解决方法,但我没有找到解决方法。我读过关于强制GC的文章,但在vba中我做不到。谁能给我一些建议吗 p.d.:谢谢你,很抱歉我的英语很差 编辑: 您好,我再次使用计时器事件与PLC通信,并据此

我正在开发一个应用程序,它将工作数天,并从user32 lib中实现一个计时器,该计时器每500毫秒运行一次例程。问题是每次执行例程时,Excel应用程序所需的内存都会增加8KB

正如我所说的,我希望这个应用程序能运行几天,所以有一点是它的内存消耗太高,而这个应用程序开始太慢

我已经在这个地方和其他地方寻找解决方法,但我没有找到解决方法。我读过关于强制GC的文章,但在vba中我做不到。谁能给我一些建议吗

p.d.:谢谢你,很抱歉我的英语很差

编辑:

您好,我再次使用计时器事件与PLC通信,并据此采取行动。可能0.5秒是如此短的时间,以至于代码无法完成例程,并且事件位于堆栈中。我想我可以把时间延长到1秒而不损失性能

这是我的密码:

API声明

Private Declare Function SetTimer Lib "user32" _
(ByVal hWnd As Long, _
ByVal nIDEvent As Long, _
ByVal uElapse As Long, _
ByVal lpTimerFunc As Long) As Long

Private Declare Function KillTimer Lib "user32" _
(ByVal hWnd As Long, _
ByVal nIDEvent As Long) As Long
定时器事件例程

Private Sub TimerEvent()

    On Error Resume Next
    Hoja1.cmdFecha.Caption = Format(Now, "dd/mm/yy hh:mm:ss")
    Hoja6.Range("I40") = 0
    'Zona Lectura PLC
    Call readFromPLC

    If Hoja6.Range("I40") = 0 Then
        Hoja4.Range("c11") = 1
    Else
        Hoja4.Range("c11") = 0
    End If
    'Zona alarmas
    If Hoja4.Range("C7") <> AlarmaAnterior Then
        ' Interrupcionpo calculo
        AlarmaAnterior = Hoja4.Range("D10")
        If Hoja4.Range("c7") = 0 Then
           Hoja1.Label1.Visible = False
        Else
            'Hoja4.Range("d8") = Hoja4.Range("d8") + 1
            'Call Control
            Call AlarmasNuevo
            Hoja1.Label1.Visible = True
        End If
    End If

    'Zona actuacion


    If Hoja6.Range("d61") <> Hoja6.Range("d62") Then
           Hoja6.Range("d62") = Hoja6.Range("d61")
             Hoja6.Range("d66") = Hoja6.Range("d66") + 1
            Call ControlArchivos
                End If
    If Hoja6.Range("d63") <> Hoja6.Range("c63") Then
        Hoja6.Range("d63") = Hoja6.Range("c63")
        Call ResetContadores
    End If


    If Hoja6.Range("I50") = 0 Then

    ElseIf Hoja6.Range("I49") <> Hoja6.Range("j49") Then
           Hoja6.Range("J49") = Hoja6.Range("i49")
           If Hoja6.Range("I49") <> 0 Then
            Call Medir
            Else
                Call StopAcq
                Sheets("ESCPLC").Range("J58") = 0
                Hoja1.cmdAvisos.Visible = False
            End If

                    End If


    'Zona escritura PLC
    If Hoja6.Range("J57") <> Hoja6.Range("L57") Or Hoja6.Range("J58") <> Hoja6.Range("L58") Or Hoja6.Range("J59") <> Hoja6.Range("L59") Or Hoja6.Range("J60") <> Hoja6.Range("L60") Or Hoja6.Range("J61") <> Hoja6.Range("L61") Then
        Hoja6.Range("L57") = Hoja6.Range("J57")
        Hoja6.Range("L58") = Hoja6.Range("J58")
        Hoja6.Range("L59") = Hoja6.Range("J59")
        Hoja6.Range("L60") = Hoja6.Range("J60")
        Hoja6.Range("L61") = Hoja6.Range("J61")
        Call writeToPLC
    End If 
End Sub

非常感谢

您需要提供更多详细信息/显示一些代码;你在用什么定时器API?就像Alex说的,我们需要更多的细节,特别是代码。可以使用.NET framework将其实现为COM解决方案,并使用GC.Collect强制执行GC。了解一下我所说的使用com库和.net框架的方法。特别是从Excel调用的.Dispose方法,但是清除了在.NET Runtimer中创建的COM对象。我也很好奇您的应用程序是做什么的。为什么要在每0.5秒后运行一次应用程序?我还想知道这个应用程序到底做了什么,它在0.5秒内就完成了,这样它就会再次被调用……你是不是在计时器一启动就停止工作,然后重新创建它?如果1秒没问题,请再次使用内置的application.ontimeHi,首先让我道歉,因为我太忙了,甚至无法测试您提供的解决方案。我发现,增加应用程序所需内存的代码行是在我刷新工作表中标签的标题时出现的。Hoja1.cmdFecha.Caption=FormatNow,dd/mm/yy hh:mm:ss我将尝试不同的方式刷新标题以防止出现这种情况。谢谢,如果我找到解决方案,我会更新这篇文章。