У меня есть приложение VBA, которое создает экземпляр COM-объекта и затем непрерывно опрашивает свойство объектов DataReady , чтобы увидеть, есть ли новые данные. Когда новые данные доступны, они помещают данные в электронную таблицу. Проблема в том, что этот макрос (подпрограмма vba) постоянно работает, и это замедляет работу Excel до сканирования и делает компьютер несколько непригодным для использования во время работы процесса. Есть ли способ, которым я могу запустить этот процесс в отдельном потоке или сделать что-то вроде фонового работника .NET?
Моими двумя попытками было использовать цикл while, подобный этому.
While(True)
If(myObject.DataReady)
Do some stuff here
End If
WEnd
, а затем это.
Sub GrabNewPoint()
If (myModule.NewDataReady_Receiver = True) Then
Do some stuff here...
End If
If (StopTest = False) Then
NextTime = Now() + TimeValue("00:00:20")
Application.OnTime NextTime, "GrabNewPoint"
End If
Вторая попытка определенно работает лучше, но все же значительно замедляет процесс. Есть ли лучшее решение?
Мой COM-объект - это библиотека классов, которую я написал на C #. Я могу добавить события, которые запускаются в библиотеке классов, когда данные готовы, но как мне прослушать эти события в программе VBA?
Я думаю, что лучшее решение - заставить COM-объект вызывать событие VBA всякий раз, когда данные готовы.
Если это не вариант (нет контроля над COM-объектом и т. Д.), То вам НЕОБХОДИМО вращать процессор. Все, что вы можете сделать, это увеличить временной интервал между проверкой свойства DataReady, которое вы уже обнаружили во втором варианте. Я бы сообразил, насколько жирно можно увеличить интервал без потери функциональности, и оставить его там.
Попробуйте это, посмотрите, улучшится ли положение.
Just pause, let the CPU fly... key is to trap it here so it releases as long as you like
Public Sub App_Hard_Wait_DoEvents(dblSeconds As Double)
If dblSeconds = 0 Then Exit Sub
Dim varStart As Variant
varStart = Timer
Do While Timer < (varStart + dblSeconds)
DoEvents
Loop
End Sub
DO
Call App_Hard_Wair_DoEvents(10)
loop until (myObject.DataReady)