HI
У меня есть элемент управления, который обращается к базе данных с использованием проприетарных наборов данных. База данных является старой базой данных ISAM.
Элемент управления использует фоновый поток для запроса базы данных с использованием проприетарных наборов данных.
Форма будет иметь несколько таких элементов управления, каждый из которых будет использовать свой собственный поток для доступа к данным, поскольку все они должны загружаться одновременно.
Собственные наборы данных обрабатывают параллелизм, отображая VCL TForm, уведомляющую пользователя о том, что открываемая таблица заблокирована другим пользователем и что набор данных ожидает снятия блокировки.
Форма имеет кнопку отмены, которая позволяет пользователю отменить ожидание блокировки.
Проблема:
При использовании проприетарных наборов данных из потока приложение будет аварийно завершать работу, зависать или выдавать какую-либо ошибку, если форма ожидания блокировки будет отображаться. Я подозреваю, что это связано с тем, что VCL не является потокобезопасным.
Я решил проблему, синхронизировав Dataset.Open, однако он поддерживает основной поток до тех пор, пока не вернется dataset.open, что может занять значительное количество времени в зависимости от сложности запроса.
Я отобразил модальный индикатор выполнения, который позволяет пользователю узнать, что что-то происходит, но мне не нравится эта идея, поскольку пользователь будет сидеть и ждать завершения индикатора выполнения.
Собственный код набора данных компилируется в основное приложение, то есть не хранится в отдельной DLL. Нам не разрешено изменять работу блокировки или отображение формы на этой стадии процесса разработки, так как мы слишком близки к выпуску.
В идеале я бы хотел, чтобы Dataset.open запускался в потоке элементов управления вместо использования основного потока, однако, похоже, это не сработает.
Может кто-нибудь еще предложить обходной путь? пожалуйста.