0

我正在编写一个线程安全组件,它将 xml 字符串记录到文件中。组件的公共方法将从许多不同(类型)的线程中调用。为简化起见,在下面的示例中,组件只需从参数返回 XML 字符串。

我的问题是:我可以避免CoInitializeEx在每个线程中调用吗?我想将CoInitializeEx()andCoUnitialize和这些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;
4

1 回答 1

0

谢谢大家的提示。

我使线程成为唯一可以访问的实例,TXMLDocument调用者会将数据添加到线程队列中,线程队列将按顺序处理它。

于 2019-03-06T07:54:07.010 回答