![]() |
|
|
![]()
|
|
| icex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.4.2007 Где: Санкт-Петербург Репутация: нет Всего: нет |
Добрый день.
Есть задача: Написать библиотеку (dll) доступа к БД Oracle, используя DOA. Основное приложение загружает ее и работает через предоставленные интерфейсы. Проблема: Возникают неуловимые (хаотичные) исключения типа AV в dll, при использовании в нитях (в каждой нити создается своя сессия для работы с БД). У TOracleSession в dll свойство ThreadSafe = True. Исключения возникают даже в случае простого соединения с БД (LogOn/LogOff) Опытным путем было установлено, что исключения можно устранить, если в приложении и библиотеке включить использование runtime пакета rtl. Но... в рамках поставленной задачи это не допустимо... Может кто сталкивался, подскажите как лечить |
|||
|
||||
| icex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.4.2007 Где: Санкт-Петербург Репутация: нет Всего: нет |
Добрый день, ЖК.
Разобрался, вообщем то DOA тут ни причем. Проблема глубже и уходит в реализацию менеджера памяти :( 1. После долгих урезаний кода удалось локализовать проблему - в конструкторе TOracleSession создаются TThreadList'ы; 2. Начал копать дальше и вместо сессий создавать/уничтожать TThreadList - исключения остались. Если смотреть код:
видим что инициализируются критические секции и создается TList. 3. Скопировал реализацию классов (TList, TListEnumerator, TThreadList) в dll и отказался от модуля Classes - не помогло. 4. Закоментировал в конструкторе и деструкторе инициализацию критической секции - работает! 5. Раскоментировал и убрал создание TList - о чудо! и так работает. Шаманство... 6. После долгих танцев с бубном оказалось, что ошибок нет если убивать в том же порядке, в котором они создавалить... Пришел к выводу: конфликтуют 2 менеджера памяти (один в основном приложении, другой в dll)... Почему так? Скорее всего создатели Delphi не предполагали использования 2 менеджеров памяти в одном процессе |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: нет Всего: 128 |
а зачем внутри TThreadList'а создавать еще один TList?
-------------------- There are always someone smarter than you... |
|||
|
||||
| icex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.4.2007 Где: Санкт-Петербург Репутация: нет Всего: нет |
Это борландовская реализация TThreadList
|
|||
|
||||
| icex |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 27.4.2007 Где: Санкт-Петербург Репутация: нет Всего: нет |
В dll нужно установить глобальную константу: IsMultiThread := True
|
|||
|
||||
![]()
|
| Правила форума "Delphi: Базы данных и репортинг" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами Обязательно указание: 1. Базы данных (Paradox, Oracle и т.п.) 2. Способа доступа (ADO, BDE и т.д.)
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |