Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Использование FireDAC в DLL / 19 сообщений из 19, страница 1 из 1
16.08.2018, 08:25
    #39688495
Sinemurius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование FireDAC в DLL
Добрый день.

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

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

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

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

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

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

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

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

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

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

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

Сегодня попробуем.
...
Рейтинг: 0 / 0
16.08.2018, 10:28
    #39688584
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование FireDAC в DLL
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
16.08.2018, 10:31
    #39688586
Sinemurius
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Использование FireDAC в DLL
Вышеприведенный код относится и к событию OnRequest в INDY сервере ?

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

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

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

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

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

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

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


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