![]() |
|
|
Регистрация | << Правила форума >> | 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. |
#2
|
|||
|
|||
![]() А почему OnExecute ?
![]() |
#3
|
||||
|
||||
![]() Цитата:
Конструктивно ничего не поменялось ![]() |
#5
|
||||
|
||||
![]() Цитата:
Сейчас в нём 22 объекта, 18 MB. Планируется обслуживать 150 штук, но есть возможность разделить их по группам, тем самым генерируя несколько файлов вместо одного. Архитектурно получается всё достаточно гибко. |
#6
|
||||
|
||||
![]() Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#7
|
|||
|
|||
![]() Для начала. В потоке COM-подсистему инициализировал (CoInitialize)? Для приложения (читай: главного потока) это для тебя делает Application, а для дочерних потоков надо делать самому.
|
#8
|
||||
|
||||
![]() Код:
type TObjThread = class(TThread) private sObj: IXMLNode; { Private declarations } protected procedure Execute; override; constructor Create(nObj: IXMLNode); end; Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |