DCOM и потоки
От: Механик Россия  
Дата: 12.05.04 13:07
Оценка:
TClass1 = class (TObject)
private:
m_FServer : ITACSServer;
public:
procedure DCOMConnect();
end;

procedure TClass1::DCOMConnect();
begin
m_FServer := CoTACSServer.CreateRemote(strRemoteComputerName);
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
m_Class1 := TClass1.Create();
m_Class1.DCOMConnect();
end;

Объект данного класса (класс приведён не полностью) создаётся при нажатии на кнопку формы,
далее вызывается метод коннекта с DCOM объектом на удалённой машине, затем вызываются различные методы
DCOM объекта. Всё отлично работает.
Далле возникла задача некоторые методы DCOM запускать в отдельном потоке. Т.е. что-то вроде этого:

type
TWT = class(TThread)
private
protected
procedure Execute; override;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
pTWT := TWT.Create(false);
end;

procedure TWT.Execute;
begin
m_Class1 := TClass1.Create();
m_Class1.DCOMConnect();
end;

Данный вариант работать перестал. Но заработал после добавленеия следующего кода в метод
т.е. для потока вызывается CoInitialize.

procedure TWT.Execute;
begin
if (CoInitFlags = -1) and (IsMultiThread) then
CoInitFlags := COINIT_MULTITHREADED; // Required for multithreaded
if Assigned(ComObj.CoInitializeEx) and (CoInitFlags <> -1) then
ComObj.CoInitializeEx(nil, CoInitFlags)
else
CoInitialize(nil);

m_Class1 := TClass1.Create();
m_Class1.DCOMConnect();
end;

Вопрос вот в чём: можно ли вызывать методы DCOM обекта из разных потоков не вызывая в каждом из них
m_FServer := CoTACSServer.CreateRemote(strRemoteComputerName); а вызвав лишь один раз и используя во
всех потоках?
... << RSDN@Home 1.1.3 beta 2 >>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.