![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
![]()
Моя длл подгружается в мой exe.
Вызывается функция дллки, которая использует синапс для подключения к сайту. Когда софт работает в один поток, проблем нет! Но стоит запустить хотябы 2 потока, вылетает с ошибкой памяти (access violation и некоторые другие, ошибка чтения/записи, всегда поразному). Примечательно то, что после первого вылета с ошибкой больше функция не выполняется вообще. Как будь-то в памяти дллки всё нарушилось, и нет больше вызываемой функции. так вот код дллки: Код:
Код:
А если сделать так: Код:
Вывод - проблема в HTTP.HTTPMethod. Я бы подумал может какая проблема в синхронизации, но если прямо в длл вызвать этот код, даже в 100 потоков всё реботает идеально. Проблема только тогда, когда вызываю функцию из загруженой дллки. Добавлю что директива stdcall; установлена в описании функции в длл и в описании функции вызова. Кто может подсказать как побороть проблему? Вариант переместить код в проект ехе и отказаться о длл не устраивает, ибо совсем каша кода получится. Да и для дальнейшего развития проекта длл удобнее. Заранее спасибо А ещё вопрос, когда 2 потока вызывают одну функцию в длл, на каждую функцию создаётся свой поток? или как? просто мжет есть смысл функцией создавать поток, ждать его завершения, и возвращать ответ... хотя мне кажется изврат конкретный. не должно так быть И что правильнее использовать, hThread:=BeginThread(nil,0,@THREAD_ START,nil,0,ThID); или hThread:=CreateThread(nil,0,@THREAD _START,nil,0,ThID); я разницы не увидел Последний раз редактировалось Stilet; 21.11.2015 в 09:53. |
![]() |
![]() |
![]() |
#2 | ||||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Цитата:
Цитата:
Цитата:
Если делать это функцией то можно callback применить: Код:
I'm learning to live...
|
||||
![]() |
![]() |
![]() |
#3 | |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
![]() Цитата:
остальной код не имеет значения в данном случае. Т.к. всё работает стабильно если длл запустить как ехе и прямо из неё выполнять код. Сейчас попробую через поток, посмотрим что получится. Я думал что функуия дллки выполняется в потоке, который её вызвал! или нет? Если так, проблем быть не должно. А если я создаю поток уже прямо в длл, получается что на одну функциюбудет создано аж 2 потока. Поясню, что я именно в потоке вызываю функцию дллки! Последний раз редактировалось lollollollol; 21.11.2015 в 10:16. |
|
![]() |
![]() |
![]() |
#4 | |||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]() Цитата:
Цитата:
Цитата:
I'm learning to live...
|
|||
![]() |
![]() |
![]() |
#5 | |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
![]() Код:
и в дллке Код:
Цитата:
Добавлю, что если я скомпилирую вместо дллки проект как exe, и создам потоки прямо в этом файле, то данная функция работает без проблем даже в 100 потоков! Даже через час жесткой работы в дипетчерез задач видно, что нет утечки памяти. Последний раз редактировалось Stilet; 21.11.2015 в 10:59. |
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
HTTP часом не глобальный объект?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
![]()
нет конечно!
В дллке вообще нет глобальных переменных. Да и еслиб он был глобальным, не работали бы 100 потоков при запуске в процессе. проблема имено с вызовом функции из длл, ну или в чём там ещё... не пойму в чём проблема. проблема возникает именно когда 2 потока ОДНОВРЕМЕННО начинают загружать информацию. Если по очереди тоже проходит гладко всё. Может как-то с переполнением памяти связано. Дллкаже ограничена в памяти моего поцесса... Последний раз редактировалось Stilet; 21.11.2015 в 11:33. |
![]() |
![]() |
![]() |
#8 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
![]()
Мдя... Самое главное ты и не показал...
Ладно, скажу напоследок: HTTP создавай и освобождай в пределах функции, и переменка эта должна быть локальной.
I'm learning to live...
|
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
![]()
ёмаё, вот то что ты сказал впринципе не обсуждается, это так и сделано.
А не показал я это потому, что даже подумать не мог, что как-то иначе можно сделать |
![]() |
![]() |
![]() |
Опции темы | Поиск в этой теме |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Проблема с dll | Кольша | Общие вопросы Delphi | 21 | 22.12.2013 20:33 |
Проблема dll | EXMP | Софт | 0 | 18.08.2010 09:30 |
Dll - проблема | nXs | Общие вопросы Delphi | 2 | 16.07.2010 14:53 |
Проблема с DLL | _-Re@l-_ | Паскаль, Turbo Pascal, PascalABC.NET | 3 | 09.06.2010 14:28 |
Проблема с dll( | DM_bite | Помощь студентам | 10 | 31.07.2008 16:05 |