Прежде всего - если у вас мало опыта работы с многопоточностью, не начинайте с классов VCL.Используйте OmniThreadLibrary по следующим причинам:
- Ваш уровень абстракции - это задача, а не поток, гораздо лучший способ работы с параллелизмом.
- Вы можете легко переключаться между выполнением задач в их собственном потоке и планированием их с помощью пула потоков.
- Все детали низкого уровня, такие как отключение потока, двунаправленная связь и многое другое, позаботятся о вас.,Вы можете сконцентрироваться на работе с базой данных.
DB-поток создает все компоненты базы данных, которые ему нужны при создании
Это может быть не лучшим способом,Обычно я создавал компоненты только при необходимости, но не уничтожал сразу.Вы должны обязательно держать соединение открытым в потоке пула потоков и закрывать его только после того, как поток неактивен в течение некоторого времени и пул удаляет его.Но также часто рекомендуется хранить кэш объектов транзакций и операторов.
Если он получает команду, он выполняет действие и возвращается в режим ожидания.В течение этого времени основной поток ожидает.
Первая часть обрабатывается нормально, когда используется OTL.Однако - не ждите основного потока, это даст небольшое преимущество по сравнению с выполнением доступа к базе данных непосредственно в потоке VCL.Вам нужен асинхронный дизайн, чтобы наилучшим образом использовать несколько потоков.Рассмотрим стандартную форму браузера базы данных, которая имеет элементы управления для фильтрации записей.Я справляюсь с этим путем (повторного) запуска таймера каждый раз, когда меняется один из элементов управления.Как только пользователь заканчивает редактирование, запускается событие таймера (скажем, через 500 мс), и запускается задача, которая выполняет инструкцию, которая выбирает данные в соответствии с критериями фильтрации.Содержимое сетки очищается и заполняется только после завершения задачи.Это может занять некоторое время, поэтому поток VCL не ожидает завершения задачи.Вместо этого пользователь может даже изменить критерии фильтра еще раз, и в этом случае текущая задача отменяется и запускается новая.OTL дает вам событие для завершения задачи, поэтому асинхронный проект легко реализовать.
Каков наилучший способ получить результаты базы данных из db-потока в основной поток?
Обычно я не использую компоненты с поддержкой данных для многопоточных приложений БД, но использую стандартные элементы управления, которые являются представлениями для бизнес-объектов.В задачах базы данных я создаю эти объекты, помещаю их в списки, и событие завершения задачи передает список в поток VCL.
Основной поток и поток БД никогда не получат доступ к запросу одновременно.
Со всеми компонентами, которые загружают данные по запросу, вы не можете быть в этом уверены.Часто только первые записи извлекаются из базы данных, и извлечение продолжается после того, как они были использованы.Такие компоненты, очевидно, не должны совместно использоваться потоками.