Handle redirects на Synapse

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by xophet, 28 Apr 2011.

  1. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Всем привет!
    Перевожу свою программу на Synapse с Indy в связи с тем, что INdy в потоке (как оказалось) ест память!
    Может у кого-нибудь есть готовая процедура (али функция) для Handle redirects для Synapse на Delphi? Или подскажите, где взять. Уже битый час бьюсь над ее реализацией (видно сказывается недостаток знаний Http протокола)!
     
  2. AlexTheC0d3r

    AlexTheC0d3r Elder - Старейшина

    Joined:
    25 Jul 2008
    Messages:
    388
    Likes Received:
    179
    Reputations:
    18
    так разбери протокол
     
  3. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    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
     
    #3 GhostOnline, 28 Apr 2011
    Last edited: 28 Apr 2011
  4. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    нет. долго искал, но все же где-то на каком-то форуме выцепил идею (как сам не додумался я хз :( ) удалить из процедуры все кроме создания и удаления компонентов, и постепенно возвращая назад строки следить когда начинает течь память . Делаю (в потоке)
    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); (во время творческих мук). ничего не поменялось!!


    За ссылки огромное спасибо, пошел читать!
     
    #4 xophet, 28 Apr 2011
    Last edited: 28 Apr 2011
  5. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Провел тест
    В цикле создается 100 экземпляров, и делается столько же запросов на гугл.
    Никаких утечек не обнаружено.
    Кстати, как ты их вообще определяешь? Ну что именно на 200 байт.
     
  6. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    ну ± (менеджером памяти виндовым). Дело в том, что fastMM эту утечку почему-то в упор не видит. Хотя ясно почему: при закрытии программы она пропадает. пробовал все из секции Form.destroy выкинуть. ничего подобного ТАКОГО размера все равно не видно (за пол-часа работы это порядка 50 мб)
     
    #6 xophet, 28 Apr 2011
    Last edited: 28 Apr 2011
  7. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Повторюсь, я работаю в потоке. Сейчас приведу пример.
    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;
    
    Это полностью взято из программы, удалил только строки, которые в процессе отладки закомментировал
     
    #7 xophet, 28 Apr 2011
    Last edited: 28 Apr 2011
  8. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Что это такое?

    Имей ввиду, что память выделяет дельфийский менеджер памяти, он просто может ее "кэшировать" и не отдавать обратно винде. Там своя кухня, чтобы разобраться нужно много пива и вечер втыкания в System.pas.
    А в стабильных версиях инди нету утечек(они могу быть в промежуточных версиях, которые как правило быстро заменяются). Тест выше это наглядно показывает,(можешь проверить - сделать исскуственную утечку и сравнить, будет показано сообщение с количеством утекших байтов) другие способы определения типа по Диспетчеру задач неактуальны на таких малых объемах. Да и наверняка ты даже не в ту колонку смотришь, по умолчанию Private bytes не показывается.

    Я не поклонник инди и как минимум год ее не использую, но и пустые наговоры не люблю.

    А какая разница? Расскажи мне свои секретные знания о выделении памяти "в потоке". Да и код в тесте тоже в потоке выполняется :D
    Могу еще посоветовать поставить
    IsMultiThread := true;

    И то что фастММ "не видит" только все доказывает.

    Я реально встречал в тырнетах дохуя говнокодеров с их говнокодом и говнорассуждениями. Вот ты сейчас тоже пишешь же бред "в инди утечки памяти"
     
    #8 GhostOnline, 28 Apr 2011
    Last edited: 28 Apr 2011
    1 person likes this.
  9. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    привел кусок кода.
    я реально встречал в тырнете разговоры о несовместимости indy и потоков, но внимания как-то не обращал (т.к. у меня все работало).
    Ну начинала прога через сутки работы есть много памяти (900мб), ну перезапустил ее да и все.
    А сейчас арендовал VPS, с 256 оперативы и слабеньким процом, это теперь кусается, всю свободную память моя прога (работая в 30 потоков) начинает занимать примерно через час-два.
    Это вешает VPS и чтобы на него зайти приходится ребутить через сайт.
    Вот и ищу как решить эту проблему.
     
    #9 xophet, 28 Apr 2011
    Last edited: 28 Apr 2011
  10. GhostOnline

    GhostOnline Active Member

    Joined:
    20 Dec 2008
    Messages:
    723
    Likes Received:
    110
    Reputations:
    22
    Я тебе уже давал ссылку на инструмент в другом топике. Он покажет тебе даже номер строки с выделением неосвобожденной памяти.
    как пользоваться читать тут:
    http://www.gunsmoker.ru/2009/05/blog-post_24.html

    это было сказано для того чтобы ты поменьше читал посты сомнительного содержания
     
    #10 GhostOnline, 28 Apr 2011
    Last edited: 28 Apr 2011
  11. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    реально достало конечно что "отцы" кроме слова "говнокодеры" ничего и сказать не могут. поэтому на форумы с вопросами обращаюсь крайне редко.
    сейчас именно этот случай. нужно сделать быстро и "на вчера".
    IsMultiThread := true; ставил. не отпустило.
    ща накидаю тестовую прогу и проверю кто же прав.
    ссыль давал, спасибо. буду читать и пробовать юзать.
    просто обидно будет, если проблема действительно будет в индейце :(
     
    #11 xophet, 28 Apr 2011
    Last edited: 28 Apr 2011
  12. xophet

    xophet Member

    Joined:
    16 Apr 2011
    Messages:
    617
    Likes Received:
    49
    Reputations:
    5
    Спасибо, что провозился со мной, пошел я EurekaLog учиться применять! :rolleyes:
    На счет постов сомнительного содержания "если человек хочет подтвердить свои параноидальные идеи, он найдет чем". Это гораздо проще, чем признать, что у самого руки не из того места :(
     
  13. Chrome~

    Chrome~ Elder - Старейшина

    Joined:
    13 Dec 2008
    Messages:
    937
    Likes Received:
    162
    Reputations:
    27
    Скачай и установи последнюю версию Indy. Если проблемма и дальше будет присутствовать - значит все таки ты делаешь что то неправильно. Вот такая простая логика действий.