На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! ПРАВИЛА РАЗДЕЛА · FAQ раздела Delphi · Книги по Delphi
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как прочитать список файлов, поддиректорий в директории?
5. Как запустить программу/файл?
... (продолжение следует) ...

Вопросы, подробно описанные во встроенной справочной системе Delphi, не несут полезной тематической нагрузки, поэтому будут удаляться.
Запрещается создавать темы с просьбой выполнить какую-то работу за автора темы. Форум является средством общения и общего поиска решения. Вашу работу за Вас никто выполнять не будет.


Внимание
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...
Модераторы: jack128, D[u]fa, Shaggy, Rouse_
  
> Поток с параметрами (вход и выход) , + XMLDocument
    При связке TIDHTTPServer и XMLDocument столкнулся с проблемой очистки памяти TXMLDocument, а именно проблема с IXMLNode. После того как этому присвоен какой-то документ, проведена его обработка и он нигде не используется, память не освобождается...

    Пробовал работу с TXMLDocument засунуть в поток.
    В потоке всё нормально. Убил поток, память освободилась... Столкнулся с проблемой...

    Так как запросы принимает IDHTTPServer, их может быть много и от разных клиентов.
    Время обработки запроса может быть разным для каждого запроса, и если во время выполнения более длинного запроса прийдет от другого клиента более короткий запрос, то в теории если не разделять данные, тот ответ одного может попасть к другому.

    В программе я такое разделял в процедуре, которая возвращает параметры
    ExpandedWrap disabled
      procedure xxx(in1:string; in2:integer; var out1:string; out2:integer);
      begin
         out1:=in1;
         out2:=in2;
      end;
       
      ...
      var
      myOutStr:string;
      myOutInt:integer;
      ...
      xxx('myInSTR', 5, myOutStr, myOutInt);


    Таким образом обратившись к данной процедуре из любого места с любыми входящими данными я буду уверен что тот кто запросил выполнение данной процедуры, получит именно свой ответ, и данные не поменяются

    Теперь вопрос: Как похожую процедуру реализовать но в потоке, т.е. В поток передать несколько параметров, и так-же получить из потока несколько параметров?
    ExpandedWrap disabled
      synchronize(mySync) // так не подойдет

    потому что запрос, который обрабатывает сервер, и ответ клиенту обрабатывается внутри одной процедуры
    ExpandedWrap disabled
      procedure TForm1.IDHTTPServerCommandGet(AContext: TIdContext;
        ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo);
      ...

    и мне нужно отправить данные на обработку в поток, и когда он закончит обработку, отправить их тому клиенту что запросил эту операцию, а не другому, что подключился тоже к серверу, и запросил свою операцию...
      Ты что-то не так делаешь. Не может он течь.
      Подключи вывод инфы об утечках (ReportMemoryLeaksOnShutdown).
      Сделай простейший тест (в цикле создавай документ, загружай файл, освобождай), посмотри на прирост памяти
        Цитата Fr0sT @

        Делал
        После 100000 раз (а загружал xml в котором только один параметр, а мне много нужно) память программы с 12мБ до примерно 80мБ в памяти
        После каждого присвоения документа IIxmlNode память увеличивается. Пробовал и на статическом компоненте, и на созданном динамически. Как только выполнил
        ExpandedWrap disabled
          var
            RootNode: IXMLNode;
          ...
          RootNode := xmll_in.DocumentElement;

        Так сразу память и растёт. Если IXMLnode не использовать то всё нормально, но без этого парсить никак. Если это делать в потоке, то при убивании потока память освобождается

        Добавлено
        Поэтому и хочу в потоке это делать.
        З.Ы. Пробовал работу с XML засунуть в библиотеку (dll) результат такой-же самый
          Цитата dreyqq @
          После 100000 раз (а загружал xml в котором только один параметр, а мне много нужно) память программы с 12мБ до примерно 80мБ в памяти

          Так это ж копейки, на уровне стартового выделения памяти. Попробуйте погонять всю ночь в бесконечном цикле - если память далее расти не будет, то никакая это не утечка, а обычная ahead-аллокация памяти "на вырост".
            +1. Менеджер памяти не отдает ОС часть оперативы, хранит для последующих выделений.
            Для отслеживания утечек есть специальные инструменты.
            Либо да, грузи 1 Мб XML в цикле на ночь и смотри, будет ли расти память. Сейчас у тебя условия за пределами разрядной сетки. Условно говоря, ты стоишь в пещере и пытаешься увидеть, как растет сталактит.
              out of memory вылетает после 400-500Мб в памяти. В системе 4Гб.
              Пробовал TXMLDocument создавать не в nil а на созданной для этого форме, и после выполнения убивать форму. Это работает. Память освобождает, НО!!! Если делать это не в модуле формы, а в модуле без формы, то создать компонент на форме не выходит, ошибка при компилировании.

              Добавлено
              Только скорость заметно падает
                Цитата dreyqq @
                Пробовал TXMLDocument создавать не в nil а на созданной для этого форме, и после выполнения убивать форму. Это работает.

                Ты каким-то хаотичным тыком занимаешься. Замеры по времени, тестовые данные, реакция инструмента отслеживания утечек наконец? А то так дошаманишься до того, чтобы каждый XML создавать в отдельном процессе, лишь бы память сама очищалась
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0,0408 ]   [ 16 queries used ]   [ Generated: 28.03.24, 08:22 GMT ]