powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование FireDAC в DLL
19 сообщений из 19, страница 1 из 1
Использование FireDAC в DLL
    #39688495
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.

Рассматриваем сейчас возможность использования FireDAC в DLL. Имеется ввиду не передача Handle TFDConnection в DLL, но полноценное создание соединения внутри DLL (вот не спрашивайте зачем, но очень нужно :) ).

В серии статей Gunsmocker-а о создании плагинов на основе DLL+интерфейсы указано о недопустимости использования секций initialization / finalization в DLL проектах.

Вместе с тем, в исходниках FieDAC видно, что практически каждый модуль библиотеки очень активно использует эти секции. Создаются и уничтожаются какие то объекты, регистрируются классы.

Можно ли в связи с этим утверждать, что данная библиотека непригодна для использования в DLL ?

Заранее спасибо.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688513
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SinemuriusВ серии статей Gunsmocker-а о создании плагинов на основе DLL+интерфейсы указано о недопустимости использования секций initialization / finalization в DLL проектах.Это скорее общая рекомендация, нежели категоричный запрет. В dllmain много чего запрещено делать. Но в отдельных случаях можно делать даже то, что запрещено, если понимать, почему это запрещено.

SinemuriusВместе с тем, в исходниках FieDAC видно, что практически каждый модуль библиотеки очень активно использует эти секции. Создаются и уничтожаются какие то объекты, регистрируются классы.Само по себе создание и уничтожение объектов и регистрация классов (по сути простая работа с памятью) не запрещены в dllmain. Нужно смотреть, что конкретно делается при создании объектов.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688536
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну собственно, мы собрали нагрузочный тест, который в DLL создает экземпляр класса, содержащий FDConnection и т.д., передает через интерфейс в основную программу и та запускает процедуру, которая пишет в табличку некие данные.
Тест запускается в нескольких потоках. Для каждого потока соответственно создается свой экземпляр класса.
Ну само собой FDManager.Active := true перед использованием.

Падает с Access Violation через несколько десятков тысяч вызовов. Причем фатально. Уничтожение и создание заново экземпляра класса не помогает, только перезапуск проги.

Самое любопытное, что если в DLL подключить SimpleShareMem, то не падает.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688553
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius,
Покажите пример кода теста?
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688569
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В dll выставлено IsMultiThread := True ?
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688575
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AniskinВ dll выставлено IsMultiThread := True ?
Его нет смысла выставлять.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688579
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
wadmanЕго нет смысла выставлять.Поясни, пж-та. Мой опыт говорит об обратном.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688580
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПокажите пример кода теста?

Он очень большой, собственно это целая система обработки запросов c INDY, к которой пока наспех прикрутили систему плагинов для доступа к БД. Ее сложно выложить.

Но если к примеру подложить dll без FIREDAC, которая просто пишет в лог те SQL, которые ей передают, то она не взрывается.

Ну и почему-то не взрывается с SimpleShareMem.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688581
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IsMultiThread нет, не выставляли в TRUE.

Сегодня попробуем.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688584
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AniskinwadmanЕго нет смысла выставлять.Поясни, пж-та. Мой опыт говорит об обратном.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
function BeginThread(SecurityAttributes: Pointer; StackSize: LongWord;
  ThreadFunc: TThreadFunc; Parameter: Pointer; CreationFlags: LongWord;
  var ThreadId: LongWord): Integer;
var
  P: PThreadRec;
begin
  if Assigned(SystemThreadFuncProc) then
    P := PThreadRec(SystemThreadFuncProc(ThreadFunc, Parameter))
  else
  begin
    New(P);
    P.Func := ThreadFunc;
    P.Parameter := Parameter;
  end;
  IsMultiThread := TRUE;
  Result := CreateThread(SecurityAttributes, StackSize, @ThreadWrapper, P,
    CreationFlags, ThreadID);
end;

...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688586
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вышеприведенный код относится и к событию OnRequest в INDY сервере ?

System.IsMultiThread в программе и в DLL - один и тот же ?
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688587
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен, если потоки стартуются в dll. Но если потоки стартуются в хосте (я предполагаю, что у ТС именно такая ситуация), то dll об этом не узнает, и менеджер памяти в dll будет по прежнему работать в однопоточном режиме.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688588
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SinemuriusSystem.IsMultiThread в программе и в DLL - один и тот же ?Нет
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688596
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Похоже выставление IsMultyThreadi в true помогло. 60000 запросов в 7 потоках пока не падает.
Попробую несколько часов погонять.
Получается, что в условия использования многопоточности в FireDac нужно включить и требование с IsMultiThread := true.

В любом случае большое спасибо.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688599
Aniskin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SinemuriusПолучается, что в условия использования многопоточности в FireDac нужно включить и требование с IsMultiThread := true.Немного поправлю:

Получается, что в условия использования многопоточности в любой dll, написанной на Delphi, нужно включить и требование с IsMultiThread := true.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688620
ziv-2014
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aniskin, Конечно, как само собой разумеющееся.
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688667
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39688769
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sinemurius,

а почему DLL, а не BPL ?

вы пишете/будете писать на других языках кроме Delphi ?
...
Рейтинг: 0 / 0
Использование FireDAC в DLL
    #39689530
Sinemurius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автора почему DLL, а не BPL ?
вы пишете/будете писать на других языках кроме Delphi ?

Маловероятно. Но на других версиях Delphi наверняка.

Хотелось бы полную автономность модулей, в которые выносится функционал сервера.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование FireDAC в DLL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]