Как лучше всего конвертировать несколько задач фонового сканирования Delphi TTimer, используя Omnithread

Я начал изучать использование Omnithread для улучшения моего приложения Delphi с использованием многопоточности. Создание одной или нескольких рабочих задач хорошо описано в документации, поэтому длинные демонстрационные действия, которые я вызываю при нажатии кнопки, могут быть заменены этим демонстрационным кодом (Async, CreateTask и т. Д.). Хотя у меня возникают трудности с заменой моего самого "грязного" кода, который работает следующим образом.

У меня есть концепция одного экземпляра класса, который соответствует аппаратному модулю. Класс публикует одно или несколько свойств, которые отображают текущие значения и настройки для оборудования. Свойства могут быть только для чтения или для чтения / записи. Для каждого из этих экземпляров класса может быть от нуля до нескольких отображаемых форм. Форма отображения имеет TTimer и встроенный список ранее опубликованных свойств. Этот список повторяется для соответствия соответствующим образом именованным элементам управления, таким как метки или элементы редактирования, а механизм RTTI используется для получения и установки значений между элементом управления и его свойством. В результате получается форма, которая обеспечивает приятный пользовательский интерфейс для реального аппаратного модуля с побочным эффектом, благодаря которому может быть открыто несколько форм, изменение данных на одной из них заставляет другие показывать эти данные вскоре после этого. Мониторинг этого свойства выполняется тикающим TTimer с интервалом 300 мс. Каждый тик заставляет его просматривать все свойства класса и обновлять соответствующий элемент управления в его форме. Таймер работает на протяжении всей жизни открытой формы. Формы создаются при необходимости, а затем освобождаются (это имеет полезную оптимизацию производительности, так как при отсутствии открытых форм для проверки аппаратного обеспечения приложение должно работать как можно быстрее, поскольку не могут выполняться никакие задачи мониторинга).

Есть ли лучший способ использовать многопоточность для доступа к моим опубликованным свойствам, а не использовать TTimer в потоке пользовательского интерфейса? Или проблемы синхронизации перевесят какие-либо преимущества? Если многопоточность полезна, как можно создать повторяющуюся задачу, например, для эмуляции таймера тикования?

0 ответов

Другие вопросы по тегам