Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

30 Июнь 2022, 19:04 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Использование слушателей для реализации callback-функций  (Прочитано 286 раз)
0 Пользователей и 1 Гость смотрят эту тему.
sokol92
Мастер
*****
Online Online

Пол: Мужской
Сообщений: 939


WWW
« Стартовое сообщение: 19 Июнь 2022, 17:11 »

Выделено из Передача значения переменной в системный буфер обмена: слушатели можно использовать в 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 (где, естественно, ссылка на макрос присвоена до цикла).
« Последнее редактирование: 20 Июнь 2022, 12:54 от mikekaganski » Записан

Владимир.
mikekaganski
Гуру
*******
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 774


« Ответ #1: 20 Июнь 2022, 10:57 »

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

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

С уважением,
Михаил Каганский
sokol92
Мастер
*****
Online Online

Пол: Мужской
Сообщений: 939


WWW
« Ответ #2: 20 Июнь 2022, 14:53 »

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

Владимир.
mikekaganski
Гуру
*******
Online Online

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 2 774


« Ответ #3: 20 Июнь 2022, 15:25 »

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

С уважением,
Михаил Каганский
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!