Поток циклически перебирает список из 1000 объектов каждую секунду. Объекты содержат простые данные конфигурации. Когда выполняются некоторые условия, рабочий поток получает данные конфигурации и выполняет некоторую работу на основе этого.Уменьшение накладных расходов при доступе к объектам, используемым потоком
Теперь я хочу открыть диалог настроек с данными конфигурации, чтобы я мог изменять данные внутри такого объекта. Но тогда я должен получить доступ к объектам в списке, пока поток также постоянно обращается к ним. Я знаю, как использовать критический раздел, но если поток входит в критический раздел каждый раз, когда он проверяет объект, тогда критический раздел будет введен и оставлен 1000 раз в секунду. Может быть, есть более умный способ?
Как сделать поточно с наименьшими накладными расходами, когда:
а) загрузки данных конфигурации в диалоговом окне Параметры формы (которая использует TListView в виртуальном режиме и требует доступа к списку объектов по требованию)
b) и сохранение формы ввода обратно к объекту?
EDIT: запрошено больше деталей.
объекты находятся в TList и в основном выглядеть следующим образом:
TConfigData = class
ID:Integer;
Name: String;
SwitchTime: TDateTime;
end;
Данные объекта ConfigData должен быть загружен в виде Settings Dialog, поэтому он может быть отредактирован, а затем, если пользователь щелкните OK, объект ConfigData должен быть обновлен, и поток будет с радостью использовать эти новые данные в следующий раз, когда будет получен доступ к обкекту. Однако обновление не должно происходить одновременно с тем, как поток читает объект ConfigData.
EDIT 2: Дополнительные детали:
Нити чтение ID, имя и SwitchTime, но только SwitchTime изменяется нитями. (Когда работа завершена, вычисляется новое время, и это то, что запускает следующее рабочее событие).
Диалог настроек может изменять как имя, так и время переключения, но не идентификатор.
Вы можете установить логическое значение, указывающее, что необходимо проверить критический раздел. Чтение и запись логической переменной является атомарной. – Graymatter
@Gray Это не помогает. Thread A читает false и продолжается. Прежде чем он сможет прочитать, поток B установил флаг true и начал изменять. Если вы действительно можете использовать такое логическое значение, почему бы блокировки существовать? –
@Rimfire Звучит так, будто вам нужен лучший дизайн. Мы могли только догадываться, что это должно быть, поскольку вы не предоставили подробностей. Очень сложно советовать о том, как работать с данными, состав которых мы ничего не знаем. –