![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| aktuba |
|
||||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Люди, я тупею со страшной скоростью
Есть такая задача: необходимо создать dll-файл, в котором присутствуют функции запросов по http в потоках. Т.е. программа подключает dll, вызывает необходимую функцию http (get или post). Dll в свою очередь создает поток, в котором создает IdHTTP и выполняет необходимый запрос. После выполнения запроса возвращает результат. Все это необходимо для того, чтобы я мог из программы одновременно создать 10 http-запросов, которые выполнялись бы параллельно. Вот тут у меня тупик (наверное сказывается пара дней без сна). Вот что имею: Модуль потока:
Модуль Dll:
Я не могу понять, как сделать так, чтобы при каждом вызове функция Get или PostStrings создавался новый поток, но не терялся старый... Поставьте меня plz на путь истинный... -------------------- ![]() |
||||
|
|||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
Я бы создал в длл динамический список хенделов потоков
да и вообще те чет надо придумать с асинхроным приходом ответов с сайтов имхо -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
На счет динамического списка - есть такая мысль, вот только как правильно реализовать? А насчет асинхронного - вообще связываться не хочу, если честно.... -------------------- ![]() |
|||
|
||||
| Romikgy |
|
||||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
при запуске потока , первые строки заносят в глобальный список потоков, хендл себя, при окончании потока , свой хендл вычеркивает из списка
хы , а терь представь у тя 2 сайта, 1 грузиться быстро , второй медленно, в длл запускаются 2 потока, (кса я так и не понял с ответом из длл) как я понимаю управления после запуска потоков передается основной проге( потоку) и с 1 сайта уже скачалось и ответ попал в ответый стринг , а со второго еще качается, как ты думаешь когда инфа закачается со второго сайта, кому она ответ передаст? -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
||||
|
|||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Вот и я про то... Есть такая идея: программа вызывает функцию передавая свой хендл. в длл в TList добавляется новый поток со всеми данными. когда поток отработал, посылается сообщение программе. программа получив сообщение вызывает еще одну функцию, которая и возвращает результат. Вроде так... Можно как-то проще сделать? -------------------- ![]() |
|||
|
||||
| Romikgy |
|
|||
![]() Любитель-программер ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7326 Регистрация: 11.5.2005 Где: Porto Franco Odes sa Репутация: 26 Всего: 146 |
зачем это ? для твоего случая имхо ни как -------------------- Владение русской орфографией это как владение кунг-фу — истинные мастера не применяют его без надобности. |
|||
|
||||
| aktuba |
|
|||
![]() Смышленный ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1915 Регистрация: 24.4.2006 Где: Планета Земля Репутация: 16 Всего: 38 |
Как это зачем? Мне же надо сообщить программе что запрос обработан. Значит надо знать, куда слать сообщение... -------------------- ![]() |
|||
|
||||
| CatATonik |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 95 Регистрация: 12.1.2007 Где: Москва Репутация: 6 Всего: 8 |
Может лучше потоку передавать указатель на CallBack функцию? Типа поток отработал, вызвал функцию передал ей текст ответа и код ошибки.
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
тоже думал над подобно "проблемой")
значит какие мысли) объекты/процедуры: 1) вызывающая программа(App), * список, в котором будут "объекты-отправители-запросов" (THttpRequests * сам класс "отправитель", THttpRequest * Callback процедура вида SendThreadCallbackEnd( AppContext: dword; ResultSize: dword); 2) библиотека (Lib), * "поток-непосредственный отправитель". например TDllSendThread * процедура создания "потока-отправителя" вида procedure CreateInitSendThread( AppContext: dword; AData: pointer; ADataSize: dword; var ALibContext: dword ); * процедура инициализации библиотеки. procedure InitLib( AppCallback: TAppCallback); которая в контексте библиотеки сохраняет указатель на callback процедуру из App * процедура получения данных из DLL, LibGetData( ALibContext: dword; ABuf: pointer; ABufSize: dword;var AReadSize: dword ); что как работает: * инициализируем Lib послать данные 1) список создает элемент THttpRequest в котором вызывается функция CreateInitSendThread передается указатель-контекст на созданный класс THttpRequest(его надо запомнить в созданном в библиотеке TDllSendThread) и отдаются некоторые данные в DLL(запрос, параметры и проч), возвращается конекст-указатель на класс TDllSendThread в библиотеке. в принципе если он уже запущен, то все. ушли забыли покачто. 2) в TDllSendThread отрабатывает запрос в Execute, "дергает" SendThreadCallbackEnd, в которую передает запомненный AppContext и размер буфера, необходимого для размещения ответа. 3) в App в SendThreadCallbackEnd приводится к THttpRequest(Pointer(AppContext)) и вызывается PrepareGetData, в которой выделяется необх буфер и вызывается LibGetData... ну в обчем мысль такая. немножко мурено, но идея вроде правильная) сам реализовывал нечто похожее, только потоки у меня были в самом приложении и вызывали функции из длл... что требовало создания служебных объектовс так называемыми "контекстами" внтури dll. p.s. конечно же не забываем про потокобезопасность! все критические участки кода (SendThreadCallbackEnd например) в критические секции Это сообщение отредактировал(а) MetalFan - 3.2.2007, 15:48 -------------------- There are always someone smarter than you... |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |