Использование слушателей для реализации callback-функций

Автор sokol92, 19 июня 2022, 17:11

0 Пользователи и 1 гость просматривают эту тему.

sokol92

Выделено из Передача значения переменной в системный буфер обмена: слушатели можно использовать в Basic и для реализации CAllback - функций. Пример:
Option Explicit
Dim Counter As Long

' ------------------------------------------------------------------------------------------------------------------
' Вызов CallBack функции, реализованной через слушатель.
' Скорость выполнения программы (1 000 000 Вызовов) - 22 сек
Sub testHandler()
Dim t, nmax As Long, i, oHandler, retval

t = getSystemTicks()
nmax = 1000000  ' число итераций
oHandler=CreateUNoListener("Handler_", "com.sun.star.awt.XEventHandler")

For i = 1 To nmax
 retval=oHandler.handleEvent(i)    ' вызываем CallBack функцию (параметр имеет тип Variant (any)
Next i

Msgbox nmax & chr(10) & (getSystemTicks - t)
End Sub

' CallBack фукнкция.
Function Handler_handleEvent(Event) As Boolean
 Counter=Counter+1
 Handler_handleEvent=IIf(Event=0, False, True)
End Function

Довольно шустро, удобно и чуть быстрее (на моей конфигурации процентов на 20), чем вызов Invoke (где, естественно, ссылка на макрос присвоена до цикла).
Владимир.

mikekaganski

Цитата: sokol92 от 19 июня 2022, 17:11
Хотя это и не по теме: слушатели можно использовать в Basic и для реализации CAllback - функций. Пример:
...
oHandler=CreateUNoListener("Handler_", "com.sun.star.awt.XEventHandler")


Возможно, использование XCallback было бы правильнее, поскольку не требует возврата булевого результата. XEventHandler всё же нужен если есть несколько обработчиков события в очереди, и возможно прерывание очереди.
С уважением,
Михаил Каганский

sokol92

Вероятно, зависит от ситуации. Бывают случаи, когда callback-функция (даже в единственном числе) через код возврата может инициировать досрочный выход из цикла обработки.
Владимир.

mikekaganski

Согласен - зависит от задачи. Пусть упоминание XCallback будет как возможная альтернатива.
С уважением,
Михаил Каганский