Как я могу отследить, когда произошло несколько событий? - PullRequest
1 голос
/ 02 августа 2009

Я пишу плагин для программы, в которой мне нужно отслеживать, когда собственные объекты добавляются, удаляются и редактируются в активном документе. В API есть события, которые запускаются при редактировании документа. Тем не менее, программа не отслеживает, когда собственные объекты действительно меняются. Вместо этого изменение объекта обрабатывается как удаляемый объект, а затем немедленно заменяется другим измененным объектом с тем же идентификатором. Это делается таким образом, чтобы программа могла отслеживать запись отмены.

После некоторых экспериментов я определил, что события вызываются следующим образом:

Добавлен объект: Событие OnAddObject

Объект удален: Событие OnDeleteObject

Объект изменен: Событие OnReplaceObject-> Событие OnDeleteObject-> Событие OnAddObject

Прямо сейчас мой плагин только наблюдает за событиями OnAdd и OnDelete, где он добавляет и удаляет экземпляры моего пользовательского объекта в коллекцию и из нее. Но это также означает, что каждый раз, когда объект изменяется, мой плагин удаляет повторную инициализацию почти идентичного объекта. Я предпочел бы просто знать, что объект документа изменился, поэтому мой пользовательский объект может быть обновлен, а не полностью восстановлен.

Как мои методы, подписанные на события OnDelete и OnAdd, могут указать, что объект на самом деле не добавляется и не удаляется, а заменяется, потому что он изменился?

Ответы [ 3 ]

0 голосов
/ 02 августа 2009

Это немного сложно из-за плохой структуры событий исходной программы. Возможно, вы могли бы поместить идентификатор удаляемого элемента в словарь вместе с текущим временем.

Таким образом, вы можете создать отдельный поток, который проверяет содержимое словаря (когда он содержит элементы). Дайте каждому элементу несколько миллисекунд (сравните DateTime от dict.), Чтобы событие Add начало, и поэтому решите, будет ли это обычное удаление или замена.

Это немного неэффективно, потому что вам придется замедлить удаление на несколько миллисекунд. Но я не могу придумать лучшего способа.

0 голосов
/ 02 августа 2009

Я предлагаю ввести переменные блокировки (например, bools)

Когда происходит событие Replaced, установите для них блокировку

В добавлены и удалены проверки блокировки переменных. Если они настроены на блокировку, установите их на разблокировку и возврат.

0 голосов
/ 02 августа 2009

Отслеживать идентификатор документа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...