IXMLDocument в компоненте доступны из разных потоков: где вызывать CoInitializeEx? - PullRequest
0 голосов
/ 04 марта 2019

Я пишу потокобезопасный компонент, который записывает XML-строку в файл.Открытый метод компонента будет вызываться из множества разных (типов) потоков.Для упрощения, в приведенном ниже примере компонент должен возвращать только строку XML из параметров.

Мой вопрос: можно ли избежать вызова CoInitializeEx в каждом потоке?Я хочу сохранить компоненты CoInitializeEx() и CoUnitialize и IXMLDocument внутри компонента, чтобы вызывающим не приходилось беспокоиться об этом.Существует ли безопасный способ для потоков вызывать эту публичную функцию, которая будет создавать TXMLDocument при каждом вызове, который они делают, даже если CoInitializeEx () будет вызываться из компонента (TMyLogger), который не выполняется в вызывающем потоке?Я не уверен, что вызов этой функции из нескольких потоков может повредить XMLDocument или нет (поскольку это интерфейс).

Пример, иллюстрирующий то, что я хочу сделать:

TMyLogger = class(TComponent)
    public
        function logLineAsXml(const aLineName: String; const aAttribNames: Array of String; const aAttribValues: Array of String): String;
end;

function TMyLogger.logLineAsXml(const aLineName: String; const aAttribNames: Array of String; const aAttribValues: Array of String): String;
var
  doc: IXMLDocument;
  node: IXMLNode;
  I: LongInt;
begin
  doc := TXMLDocument.Create(Nil);
  try
    doc.XML.Clear;
    doc.Active := True;
    node := doc.AddChild(aLineName);
    for I := Low(aAttribNames) to High(aAttribNames) do begin
      node.Attributes[aAttribNames[I]] := aAttribValues[I];
    end;
    Result := node.XML;
  finally
    doc := nil;
  end;
end;

procedure TMyThread.Execute;
begin
    while not Terminated do begin
        DM.logger.logLineAsXml('log',['attrib1','[attrib2'],['x','y']); //must save line as  <log attrib1="x" attrib2="y"/>
    end;
end;

1 Ответ

0 голосов
/ 06 марта 2019

Спасибо за подсказки всем.

Я сделал поток единственным экземпляром, который получит доступ к TXMLDocument, вызывающие добавят данные в очередь потоков, которые будут обрабатывать их последовательно.

...