Показать сообщение отдельно
  #17  
Старый 17.03.2015, 10:12
Аватар для Uniq!
Uniq! Uniq! вне форума
Местный
 
Регистрация: 29.09.2010
Сообщения: 539
Версия Delphi: Delphi XE3
Репутация: 374
По умолчанию

Цитата:
Сообщение от Alex_4444
Может я не правильно понял задачу. Я видел лишь попытку разбора дерева, а что делается с листьями? Куда ложатся данные? Если в одно и то же место - следует ли учесть порядок данных? и т.д.

В конечном итоге я всё разобрал. Мне одноуровневого разбиения на потоки достаточно.
Глубже нет смысла разбивать. Листья складируются в ADODataSet (MySQL таблица) созданный каждый в своём потоке.

Работает всё ужасно не стабильно и криво. Сейчас я сохраняю каждую ветку XML в массив.
Передаю определённую элемент массива в поток, и кладу этот поток в другой массив (определённо длины).
Пока первый массив не иссякнет так и гоняю.

Время от времени появляются ошибки доступа к памяти.
И что-то мне подсказывает, что нельзя таким образом работать с объектом XMLDocument.

Код:
  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];

  while Length(ObjectsArr) > 0 do
    for ObjNr := 0 to 4 do
      if (ParsersArr[ObjNr] = nil) or (ParsersArr[ObjNr].Finished) then
      begin
        temp := Length(ObjectsArr) - 1;
        ParsersArr[ObjNr] := TParser.Create(ObjectsArr[temp]);
        SetLength(ObjectsArr, (Length(ObjectsArr) - 1));
      end;

Кто-нибудь может объяснить, как воспользоваться конструкцией для создания Очереди задач?
Код:
function TForm1.DoWorkForQueue(aQueue: TThreadList): boolean;
begin
  with aQueue.LockList do
    try
      Result := not(Count = 0);
    finally
      aQueue.UnlockList;
    end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  Queue: TThreadList;
  Pool: TThreadList;
  objNo: integer;
const
  MaxThreadCount = 5;
begin
  Queue := TThreadList.Create;
  try
    for objNo := 0 to XMLDoc.DocumentElement.ChildNodes.Count - 1 do
      Queue.Add(XMLDoc.DocumentElement.ChildNodes[objNo]); // Ошибка соответствия Типов TPointer и IXMLNode

    while DoWorkForQueue(Queue) do
    begin
      Pool := TThreadList.Create;
      with Pool.LockList do
        try
          if Count < MaxThreadCount then
            Add(TXmlToSql.Create(Queue));
        finally
          Pool.UnlockList;
        end;
     end;

  finally
    Queue.Free;
  end;
end;

Я понять не могу как передать TPointer на кусок XML'я в TThreadList.

Imlike, к вам ещё вопрос:
Стоит ли хранить потоки в таком же списке для их "подсчёта"?
Или просто завести глобальную переменную для их подсчёта (инкрементировать при создании, и декрементировать при уничтожении потока)
Ответить с цитированием