Поделиться через


Защита от повторного входа в функциях-перехватчиках

Хотя функция перехватчика обрабатывает событие, могут быть активированы дополнительные события, что может привести к повторному входу в функцию перехватчика до завершения обработки исходного события. Проблема с повторным вызовом в функциях перехватчика заключается в том, что события завершаются в неверной последовательности, если функция перехватчика не обрабатывает эту ситуацию.

Например, рассмотрим случай, когда функция перехватчика в программе чтения с экрана обрабатывает событие EVENT_OBJECT_VALUECHANGE для элемента управления редактированием. Если при обработке первого события изменения значения функция перехватчика повторно вводится для обработки последующего события изменения значения, то второе событие завершается до первого события. Эта ситуация приводит к тому, что средство чтения с экрана передает неточные сведения пользователю.

Так как обработка событий прерывается, дополнительные события могут получаться в любой момент, когда функция перехватчика вызывает функцию, которая приводит к проверке очереди сообщений собственного потока. Это происходит, когда любой из следующих вызовов осуществляется в функции перехватчика:

Так как функции перехватчика вызывают AccessibleObjectFromEvent и свойства и методы IAccessible, невозможно предотвратить реентерабельность. Единственное решение заключается в том, чтобы разработчики клиентов встраивали код в функцию перехватчика, которая обнаруживает реентерабельность и принимает соответствующие меры, если функция перехватчика повторно вызвана.