У меня есть большое приложение Delphi, в котором есть основной «серверный» код, содержащий мои данные.В одном и том же приложении «клиент» пользователь может открывать и закрывать несколько немодальных «клиентских» форм для проверки этих данных.Изменения данных делятся на два типа - основные (например, структурные изменения, такие как данные были добавлены или удалены) и второстепенные, такие как изменение значения данных.Существующие открытые клиентские формы должны обновляться для отображения измененных данных в кратчайшие сроки.Это не база данных, мой «сервер» использует мои собственные структуры данных, поэтому мои решения могли упустить, возможно, стандартные методы, доступные в рамках официальной структуры базы данных.Тем не менее, я повторял свои решения так много раз, что решил спросить, есть ли формальные методы и, возможно, компоненты Delphi, которые улучшат или упростят мой код.Я собираюсь перейти к многопоточному коду, который делает вопрос еще более актуальным для меня.
Я использую два метода:
Отметка времени.Код 'server' поддерживает значение Int64, полученное из QueryPerformanceCounter.Клиентские формы проверяют это значение на таймере 300 мс и обновляются, если их копия метки времени отличается от копии сервера.Я полагаю, что это мое решение «тянуть».
Уведомление интерфейсаКод «сервера» поддерживает класс, унаследованный от TInterfaceList с помощью методов AddClient и RemoveClient, которые регистрируют простой общий интерфейс уведомлений клиента.Каждый из клиентов регистрируется в этом списке при создании и отменяет регистрацию при уничтожении.Изменения данных на сервере вызывают итерацию по этому списку, вызывая каждого клиента, чтобы сообщить ему об изменениях.Полагаю, это мое решение «push».
Мне нравятся интерфейсы, и решение 2 кажется хорошим, поскольку оно избегает тиковых таймеров и легко отлаживается (хотя вызовы отмены регистрации могут быть проблематичными в порядкеразрушение).Также есть потенциальные последствия для производительности, потому что вполне вероятно, что в секунду могут происходить тысячи изменений данных, и я должен быть осторожен, чтобы использовать механизм BeginUpdate / EndUpdate для преобразования моих многочисленных изменений данных на сервере в один фактический вызов уведомления.В конечном итоге мне понадобился какой-то таймер, чтобы объединить вызовы в одно аккуратное обновление отображаемой формы.
Хотя оба решения работают прекрасно, и я разрываюсь между ними.Для многопоточного решения я уверен, что есть и другие подводные камни, о которых я ничего не знаю.Любые замечания будут оценены.Я использую XE2.