Скажите пожалуйста, вот в такой конструкции:
Код:
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