|
|
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
Добрый день. Рассматриваем сейчас возможность использования FireDAC в DLL. Имеется ввиду не передача Handle TFDConnection в DLL, но полноценное создание соединения внутри DLL (вот не спрашивайте зачем, но очень нужно :) ). В серии статей Gunsmocker-а о создании плагинов на основе DLL+интерфейсы указано о недопустимости использования секций initialization / finalization в DLL проектах. Вместе с тем, в исходниках FieDAC видно, что практически каждый модуль библиотеки очень активно использует эти секции. Создаются и уничтожаются какие то объекты, регистрируются классы. Можно ли в связи с этим утверждать, что данная библиотека непригодна для использования в DLL ? Заранее спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 08:25 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
SinemuriusВ серии статей Gunsmocker-а о создании плагинов на основе DLL+интерфейсы указано о недопустимости использования секций initialization / finalization в DLL проектах.Это скорее общая рекомендация, нежели категоричный запрет. В dllmain много чего запрещено делать. Но в отдельных случаях можно делать даже то, что запрещено, если понимать, почему это запрещено. SinemuriusВместе с тем, в исходниках FieDAC видно, что практически каждый модуль библиотеки очень активно использует эти секции. Создаются и уничтожаются какие то объекты, регистрируются классы.Само по себе создание и уничтожение объектов и регистрация классов (по сути простая работа с памятью) не запрещены в dllmain. Нужно смотреть, что конкретно делается при создании объектов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 08:50 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
Ну собственно, мы собрали нагрузочный тест, который в DLL создает экземпляр класса, содержащий FDConnection и т.д., передает через интерфейс в основную программу и та запускает процедуру, которая пишет в табличку некие данные. Тест запускается в нескольких потоках. Для каждого потока соответственно создается свой экземпляр класса. Ну само собой FDManager.Active := true перед использованием. Падает с Access Violation через несколько десятков тысяч вызовов. Причем фатально. Уничтожение и создание заново экземпляра класса не помогает, только перезапуск проги. Самое любопытное, что если в DLL подключить SimpleShareMem, то не падает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 09:07 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
Sinemurius, Покажите пример кода теста? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 09:46 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
В dll выставлено IsMultiThread := True ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:07 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
AniskinВ dll выставлено IsMultiThread := True ? Его нет смысла выставлять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:15 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
wadmanЕго нет смысла выставлять.Поясни, пж-та. Мой опыт говорит об обратном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:20 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
авторПокажите пример кода теста? Он очень большой, собственно это целая система обработки запросов c INDY, к которой пока наспех прикрутили систему плагинов для доступа к БД. Ее сложно выложить. Но если к примеру подложить dll без FIREDAC, которая просто пишет в лог те SQL, которые ей передают, то она не взрывается. Ну и почему-то не взрывается с SimpleShareMem. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:22 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
IsMultiThread нет, не выставляли в TRUE. Сегодня попробуем. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:23 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
AniskinwadmanЕго нет смысла выставлять.Поясни, пж-та. Мой опыт говорит об обратном. Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:28 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
Вышеприведенный код относится и к событию OnRequest в INDY сервере ? System.IsMultiThread в программе и в DLL - один и тот же ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:31 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
Согласен, если потоки стартуются в dll. Но если потоки стартуются в хосте (я предполагаю, что у ТС именно такая ситуация), то dll об этом не узнает, и менеджер памяти в dll будет по прежнему работать в однопоточном режиме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:32 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
SinemuriusSystem.IsMultiThread в программе и в DLL - один и тот же ?Нет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:32 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
Похоже выставление IsMultyThreadi в true помогло. 60000 запросов в 7 потоках пока не падает. Попробую несколько часов погонять. Получается, что в условия использования многопоточности в FireDac нужно включить и требование с IsMultiThread := true. В любом случае большое спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:39 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
SinemuriusПолучается, что в условия использования многопоточности в FireDac нужно включить и требование с IsMultiThread := true.Немного поправлю: Получается, что в условия использования многопоточности в любой dll, написанной на Delphi, нужно включить и требование с IsMultiThread := true. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 10:44 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
Aniskin, Конечно, как само собой разумеющееся. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 11:11 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
Sinemurius, а почему DLL, а не BPL ? вы пишете/будете писать на других языках кроме Delphi ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.08.2018, 13:02 |
|
||
|
Использование FireDAC в DLL
|
|||
|---|---|---|---|
|
#18+
автора почему DLL, а не BPL ? вы пишете/будете писать на других языках кроме Delphi ? Маловероятно. Но на других версиях Delphi наверняка. Хотелось бы полную автономность модулей, в которые выносится функционал сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.08.2018, 15:17 |
|
||
|
|

start [/forum/topic.php?fid=58&fpage=99&tid=2040515]: |
0ms |
get settings: |
11ms |
get forum list: |
17ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
49ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
51ms |
get tp. blocked users: |
1ms |
| others: | 246ms |
| total: | 391ms |

| 0 / 0 |
