Delphi - Создание элемента управления, который выполняется в своем собственном процессе - PullRequest
0 голосов
/ 20 марта 2011

HI

У меня есть элемент управления, который обращается к базе данных с использованием проприетарных наборов данных. База данных является старой базой данных ISAM.

Элемент управления использует фоновый поток для запроса базы данных с использованием проприетарных наборов данных.

Форма будет иметь несколько таких элементов управления, каждый из которых будет использовать свой собственный поток для доступа к данным, поскольку все они должны загружаться одновременно.

Собственные наборы данных обрабатывают параллелизм, отображая VCL TForm, уведомляющую пользователя о том, что открываемая таблица заблокирована другим пользователем и что набор данных ожидает снятия блокировки.

Форма имеет кнопку отмены, которая позволяет пользователю отменить ожидание блокировки.

Проблема:

При использовании проприетарных наборов данных из потока приложение будет аварийно завершать работу, зависать или выдавать какую-либо ошибку, если форма ожидания блокировки будет отображаться. Я подозреваю, что это связано с тем, что VCL не является потокобезопасным.

Я решил проблему, синхронизировав Dataset.Open, однако он поддерживает основной поток до тех пор, пока не вернется dataset.open, что может занять значительное количество времени в зависимости от сложности запроса.

Я отобразил модальный индикатор выполнения, который позволяет пользователю узнать, что что-то происходит, но мне не нравится эта идея, поскольку пользователь будет сидеть и ждать завершения индикатора выполнения.

Собственный код набора данных компилируется в основное приложение, то есть не хранится в отдельной DLL. Нам не разрешено изменять работу блокировки или отображение формы на этой стадии процесса разработки, так как мы слишком близки к выпуску.

В идеале я бы хотел, чтобы Dataset.open запускался в потоке элементов управления вместо использования основного потока, однако, похоже, это не сработает.

Может кто-нибудь еще предложить обходной путь? пожалуйста.

Ответы [ 2 ]

1 голос
/ 20 марта 2011

Волокна не помогут вам ни на шаг, потому что они в Windows API исключительно для облегчения переноса старого кода, написанного с учетом совместной многозадачности.Волокна - это в основном форма сопрограмм, все они выполняются в одном и том же процессе, имеют свое собственное пространство стека, и переключение между ними контролируется пользовательским кодом, а не ОС.Это означает, что переключение между ними может происходить только в безопасное время, поэтому проблем с синхронизацией нет.OTOH означает, что в одном потоке одновременно может работать только одно волокно, поэтому использование волокон с кодом блокировки имеет те же характеристики, что и вызов кода блокировки из одного потока - приложение перестает отвечать на запросы.

Вы можетеиспользовать волокна вместе с несколькими потоками, но это может быть опасно и не дает никакой выгоды по сравнению с использованием одних потоков.

Я успешно использовал волокна в приложениях VCL, но только для определенных целей.Забудьте о них, если вы хотите иметь дело с потенциально блокирующим кодом.

Что касается вашей проблемы - вы должны создать элемент управления, который используется только для целей отображения и который использует стандартные механизмы межпроцессного взаимодействия для обмена даннымис другим процессом, который обращается к вашей базе данных.

0 голосов
/ 20 марта 2011

COM-объекты могут работать в режиме вне процесса. Может быть, в Delphi их будет немного легче использовать, чем другие механизмы IPC.

...