Около блокировок
От: Slicer [Mirkwood] Россия https://ru.linkedin.com/in/maksim-gumerov-039a701b
Дата: 22.09.05 15:10
Оценка:
Прошу прощения за странную формулировку сабжа

На самом деле проблема немного другого плана, но она может быть сведена к блокировкам.

Background: есть в картографическом приложении диспетчер выбираемых юзером объектов (selection manager), он рассылает своим слушателям уведомления о активации некоторого нового selection. При этом selection'ы могут быть разных видов, и тогда они не отменяют друг друга. То есть ткнул юзер в объект на карте — создается объект с интерфейсом IXXXSelection, ткнул в целый слой с объектами — создается объект с интерфейсом IYYYSelection. Некоторые слушатели слушают только XXX или YYY, некоторые слушают все подряд. Кроме того, какой-то визуальный элемент может отображать информацию по объекту, который был выбран ранее, хотя после него юзер уже выбрал какой-то другой объект (например, я сказал "зафиксировать окно на данном объекте").

Проблема: допустим, юзер выбирает слой с объектами, информация по слою отображается в Object Inspector. Затем юзер выполняет удаление этого слоя. Надо, чтобы при этом у всех слушателей, которые отображают этот слой, сработал сброс отображаемой информации. Причем даже если элемент выводит устаревший selection, все равно он должен получить сообщение, если этот selection станет невалидным.

Очевидное решение: подписываем слушателя не только у SelectionManager, но и у самого selection — на сообщение о его инвалидности. Тогда визуальный элемент читает нужные ему данные, а при этом держит полученный Selection. Когда он получает от selection сигнал сброса, или получает от selectionManager другой selection — он выкидывает запомненный selection.

Недостаток решения: нет защиты от дурака. Если я заберу у ILayerSelection указатель на собственно слой, и буду что-то отображать по слою, а selection запоминать не стану — мне никогда не придет сообщение о инвалидности selection'а. Вот тут как раз и имеем параллель с блокировками доступа: надо как-то явно или неявно лочить selection, так, что доступ к завернутым в него данным возможен только в залоченном состоянии (тогда волей-неволей придется держать selection, пока нам нужны завернутые в него данные). Но как ни блокируй — все равно можно по ошибке или из-за лени просто залочить, взять указатель на данные, разлочить и опять читать данные уже без блокировки А хочется, чтобы система была более дуракостойкой, т.к. ее человек 20 пишут, и не все из нашей конторы...

Что можете посоветовать, коллеги?

Slicer
Специалист — это варвар, невежество которого не всесторонне :)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.