我正在编写一个将xml字符串记录到文件中的线程安全组件。组件的public方法将从许多不同的(类型)线程中调用。为简化起见,在下面的示例中,该组件仅需要从参数返回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;
答案 0 :(得分:0)
感谢大家的提示。
我使线程成为唯一可以访问TXMLDocument
的实例,调用者会将数据添加到线程队列中,该队列将按顺序对其进行处理。