Показать сообщение отдельно
  #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
Ответить с цитированием