|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
Опции темы | Поиск в этой теме |
21.11.2015, 09:37 | #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. |
21.11.2015, 10:00 | #2 | ||||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
Цитата:
Цитата:
Если делать это функцией то можно callback применить: Код:
I'm learning to live...
|
||||
21.11.2015, 10:14 | #3 | |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
Цитата:
остальной код не имеет значения в данном случае. Т.к. всё работает стабильно если длл запустить как ехе и прямо из неё выполнять код. Сейчас попробую через поток, посмотрим что получится. Я думал что функуия дллки выполняется в потоке, который её вызвал! или нет? Если так, проблем быть не должно. А если я создаю поток уже прямо в длл, получается что на одну функциюбудет создано аж 2 потока. Поясню, что я именно в потоке вызываю функцию дллки! Последний раз редактировалось lollollollol; 21.11.2015 в 10:16. |
|
21.11.2015, 10:20 | #4 | |||
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Цитата:
Цитата:
Цитата:
I'm learning to live...
|
|||
21.11.2015, 10:37 | #5 | |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
Код:
и в дллке Код:
Цитата:
Добавлю, что если я скомпилирую вместо дллки проект как exe, и создам потоки прямо в этом файле, то данная функция работает без проблем даже в 100 потоков! Даже через час жесткой работы в дипетчерез задач видно, что нет утечки памяти. Последний раз редактировалось Stilet; 21.11.2015 в 10:59. |
|
21.11.2015, 10:49 | #6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
HTTP часом не глобальный объект?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
21.11.2015, 10:53 | #7 |
Форумчанин
Регистрация: 23.03.2013
Сообщений: 218
|
нет конечно!
В дллке вообще нет глобальных переменных. Да и еслиб он был глобальным, не работали бы 100 потоков при запуске в процессе. проблема имено с вызовом функции из длл, ну или в чём там ещё... не пойму в чём проблема. проблема возникает именно когда 2 потока ОДНОВРЕМЕННО начинают загружать информацию. Если по очереди тоже проходит гладко всё. Может как-то с переполнением памяти связано. Дллкаже ограничена в памяти моего поцесса... Последний раз редактировалось Stilet; 21.11.2015 в 11:33. |
21.11.2015, 11:00 | #8 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Мдя... Самое главное ты и не показал...
Ладно, скажу напоследок: HTTP создавай и освобождай в пределах функции, и переменка эта должна быть локальной.
I'm learning to live...
|
21.11.2015, 11:05 | #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 |