Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 13.03.2015, 19:20
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию IXMLNode объект из XMLDocument

Скажите пожалуйста, вот в такой конструкции:

Код:
var
   Objects : IXMLNode; // вся структура файла целиком
   ObjectsArr : array of IXMLNode; // массив (разделение всего файла на составляющие)
...
begin
...
FormMain.XMLDoc.FileName := LOKAL_DIR + 'XML\' + FileName;
FormMain.XMLDoc.Active := true;
Objects := FormMain.XMLDoc.DocumentElement;

SetLength(ObjectsArr, Objects.ChildNodes.Count);
for ObjNr := 0 to Objects.ChildNodes.Count - 1 do
     ObjectsArr[ObjNr] := Objects.ChildNodes[ObjNr];

Каждый элемент массива ObjectsArr является самостоятельным ресурсом, с точки зрения потока
или этот элемент хранит лишь ссылку на объект XMLDoc, который будет закрывать к себе доступ для других потоков(второго третьего...) при обращении к нему одного (первого)?

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

Дальше в цикле я просто создаю потоки, заполняя ими буффер менеджера потоков (максимум 10 штук потоков):

Код:
while Length(ObjectsArr) > 0 do
  for ObjNr := 0 to 9 do
    if (ParsersArr[ObjNr] = nil) or (ParsersArr[ObjNr].Finished) then
    begin
      temp := Length(ObjectsArr) - 1;

      FormMain.Log.Lines.Add('[INFO] [' + DateTimeToStr(Now) +
        ']: Parsing Object Nr: ' + ObjectsArr[temp].ChildValues['T_Number']);

      ParsersArr[ObjNr] := TParser.Create(ObjectsArr[temp]);
      SetLength(ObjectsArr, (Length(ObjectsArr) - 1));
    end;

Передаю конкретный IXMLNode потоку в Private секцию:
Код:
type
  TParser = class(TTHread)
  private
    fObject: IXMLNode;
  protected
    procedure Execute; override;
  public
    constructor Create(XMLNode: IXMLNode);
  end;

constructor TParser.Create(XMLNode: IXMLNode);
begin
  inherited Create(false);
  self.fObject := XMLNode;
end;

И дальше развлечения уже идут внутри метода Execute. Там просто обычная работа с IXMLNode

Последний раз редактировалось Uniq!, 13.03.2015 в 19:25.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 20:56.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025