![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
У месть есть большой 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 получаю ошибку Код:
Abstract Error. Код:
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. Последний раз редактировалось Uniq!, 25.02.2015 в 15:19. |