组件中的ixmldocument从不同的线程访问:在哪里调用Coinitializeex



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

我的问题是:我可以避免在每个线程中调用CoInitializeEx吗?我想将CoInitializeEx()CoUnitialize以及IXMLDocument的内容保留在组件中,以便呼叫者不必为此担心。线程如何调用该公共功能,该函数会在他们进行的每个呼叫上创建TXMLDocument,即使Coinitializeex()将从组件(Tmylogger)调用,该组件(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;

感谢所有大家的提示。

我使该线程成为唯一可以访问TXMLDocument的实例,呼叫者将将数据添加到线程队列中,该线程将依次处理。

最新更新