Я пишу потокобезопасный компонент, который записывает 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;