Всем привет! Перевожу свою программу на Synapse с Indy в связи с тем, что INdy в потоке (как оказалось) ест память! Может у кого-нибудь есть готовая процедура (али функция) для Handle redirects для Synapse на Delphi? Или подскажите, где взять. Уже битый час бьюсь над ее реализацией (видно сказывается недостаток знаний Http протокола)!
1. если работаешь с дельфи то почитай этот блог http://www.webdelphi.ru/tag/synapse/, в частности в посте http://www.webdelphi.ru/2010/10/class-helper-dlya-synapse/ есть пример того что тебе нужно 2. Заголовки имеют тип TSrtingList. Поставил NameValueSepartor в ': ' и вуаля, в Names у нас названия полей, в Values значения. В том посте кстати быдлокод, автор не знает про NameValueSeparator и Values[Name], о чем я ему писал, но он благополучно удалил коммент. Как можно биться над этим целый час я хз, никогда не работал с синапсом но до решения сразу додумался. 3. Бред. Наверняка наговнокодил и получил утечки памяти. Чтобы ты еще не втыкал в мой пост вот тебе объявление свойства Values думаю дальше допрешь upd. NameValueSeparator имеет тип char потому ставим его в ':' а само значение прогоняем через Trim
нет. долго искал, но все же где-то на каком-то форуме выцепил идею (как сам не додумался я хз ) удалить из процедуры все кроме создания и удаления компонентов, и постепенно возвращая назад строки следить когда начинает течь память . Делаю (в потоке) Code: try http:=idhttp.create(nil); finally http.free; end; Все ок, ничего не течет Делаю: Code: try http:=idhttp.create(nil); s:=http.get('http://www.непомнючеза.сайт'); finally http.free; end; По 200 байт за вызов течет. даже в finally добавлял freeandnil(s); (во время творческих мук). ничего не поменялось!! За ссылки огромное спасибо, пошел читать!
Провел тест В цикле создается 100 экземпляров, и делается столько же запросов на гугл. Никаких утечек не обнаружено. Кстати, как ты их вообще определяешь? Ну что именно на 200 байт.
ну ± (менеджером памяти виндовым). Дело в том, что fastMM эту утечку почему-то в упор не видит. Хотя ясно почему: при закрытии программы она пропадает. пробовал все из секции Form.destroy выкинуть. ничего подобного ТАКОГО размера все равно не видно (за пол-часа работы это порядка 50 мб)
Повторюсь, я работаю в потоке. Сейчас приведу пример. Code: function FThread.LoginToSite(var LR1: loginRecord): Boolean; //функция для выполнения логина var Http: TidHttp; CM: TidCookieManager; Data: TStringList; Temp: Integer; TempString: string; ExcStringList: TStringList; begin Loginned := False; try Http := TIdHTTP.Create(nil); TempString := HTTP.Get(Site+'/main'); finally FreeAndNil(TempString); Http.Free; end; end; procedure FThread.Execute; var posfind, posnext: Integer; TempWorkNeeded, errcode: integer; working, TimesToSleep: Integer; begin repeat Result := ''; loginned:=False; begin try CriticalSectionSiteChange.Enter; SendMessage(Form1.Handle,WM_ASK_FOR_SITE, 0, 0); TempSitetoWork:=Form1.SiteToWork; site:=Form1.site; login:=Form1.login; pass:=form1.pass; HowMuchNeeded:=form1.howmuchneeded; finally CriticalSectionSiteChange.Leave; end; if not terminated then LoginToSite(LR) else Exit; end; until Terminated; end; Это полностью взято из программы, удалил только строки, которые в процессе отладки закомментировал
Что это такое? Имей ввиду, что память выделяет дельфийский менеджер памяти, он просто может ее "кэшировать" и не отдавать обратно винде. Там своя кухня, чтобы разобраться нужно много пива и вечер втыкания в System.pas. А в стабильных версиях инди нету утечек(они могу быть в промежуточных версиях, которые как правило быстро заменяются). Тест выше это наглядно показывает,(можешь проверить - сделать исскуственную утечку и сравнить, будет показано сообщение с количеством утекших байтов) другие способы определения типа по Диспетчеру задач неактуальны на таких малых объемах. Да и наверняка ты даже не в ту колонку смотришь, по умолчанию Private bytes не показывается. Я не поклонник инди и как минимум год ее не использую, но и пустые наговоры не люблю. А какая разница? Расскажи мне свои секретные знания о выделении памяти "в потоке". Да и код в тесте тоже в потоке выполняется Могу еще посоветовать поставить IsMultiThread := true; И то что фастММ "не видит" только все доказывает. Я реально встречал в тырнетах дохуя говнокодеров с их говнокодом и говнорассуждениями. Вот ты сейчас тоже пишешь же бред "в инди утечки памяти"
привел кусок кода. я реально встречал в тырнете разговоры о несовместимости indy и потоков, но внимания как-то не обращал (т.к. у меня все работало). Ну начинала прога через сутки работы есть много памяти (900мб), ну перезапустил ее да и все. А сейчас арендовал VPS, с 256 оперативы и слабеньким процом, это теперь кусается, всю свободную память моя прога (работая в 30 потоков) начинает занимать примерно через час-два. Это вешает VPS и чтобы на него зайти приходится ребутить через сайт. Вот и ищу как решить эту проблему.
Я тебе уже давал ссылку на инструмент в другом топике. Он покажет тебе даже номер строки с выделением неосвобожденной памяти. как пользоваться читать тут: http://www.gunsmoker.ru/2009/05/blog-post_24.html это было сказано для того чтобы ты поменьше читал посты сомнительного содержания
реально достало конечно что "отцы" кроме слова "говнокодеры" ничего и сказать не могут. поэтому на форумы с вопросами обращаюсь крайне редко. сейчас именно этот случай. нужно сделать быстро и "на вчера". IsMultiThread := true; ставил. не отпустило. ща накидаю тестовую прогу и проверю кто же прав. ссыль давал, спасибо. буду читать и пробовать юзать. просто обидно будет, если проблема действительно будет в индейце
Спасибо, что провозился со мной, пошел я EurekaLog учиться применять! На счет постов сомнительного содержания "если человек хочет подтвердить свои параноидальные идеи, он найдет чем". Это гораздо проще, чем признать, что у самого руки не из того места
Скачай и установи последнюю версию Indy. Если проблемма и дальше будет присутствовать - значит все таки ты делаешь что то неправильно. Вот такая простая логика действий.