У месть есть большой XML файл, который содержит в себе 20-30 структур строительных зданий (nObj - одна структура).
Без потоков я просто беру параметрический цикл:
Код:
iObjs := XMLDoc.DocumentElement;
for ObjNr := 0 to iObjs.ChildNodes.Count - 1 do
begin
nObj := iObjs.ChildNodes[ObjNr];
txtObjNr := nObj.ChildValues['T_Number'];
txtObjCity := nObj.ChildValues['City'];
txtObjAddress := nObj.ChildValues['Street'];
// внутренний парсинг конкретного nObj
end
Медленно. Поэтому решил каждый объект отдать на растерзание парсеру в отдельный поток:
Класс потока:
Код:
type
TObjThread = class(TThread)
private
sObj: IXMLNode;
{ Private declarations }
protected
procedure Execute;
constructor Create(nObj: IXMLNode);
end;
constructor TObjThread.Create(nObj: IXMLNode);
begin
inherited Create(True);
self.sObj := nObj;
Resume;
end;
Далее в вышеуказанном цикле пытаюсь создать экземпляр потока:
Код:
for ObjNr := 0 to iObjs.ChildNodes.Count - 1 do
begin
nObj := iObjs.ChildNodes[ObjNr];
ObjThread := TObjThread.Create(nObj);
end
Но когда дело доходит до Execute получаю ошибку
Вот код процедуры Execute (Ради пробы пера просто пытаюсь получить значение полей из структуры nObj)
Код:
procedure TObjThread.Execute;
var
txtObjNr, txtObjCity, txtObjAddress: OleVariant;
begin
txtObjNr := sObj.ChildValues['T_Number'];
txtObjCity := sObj.ChildValues['City'];
txtObjAddress := sObj.ChildValues['Street'];
end;
Что я делаю не так? Чую, что дело в переменной nObj, которая является лишь ссылкой на часть "байт" в структуре iObjs (TXMLDocument),и по факту каждый поток пытается оперировать с одним и тем же TXMLDocument.