Конференция "Corba" » Сервер tmApartment работает как tmSingle [Delphi, Windows]
 
  • dem (12.05.08 19:33) [0]
    Заметил, что COM-сервер с потоковой моделью tmApartment работает так, будто у него модель tmSingle. Проверял в Delphi 7. Cделал тестовый пример:

    1. Создал COM-объект с единственным методом, возвращающим ИД потока, в котором он выполнен.

    2. Подключился к серверу двумя клиентами. Создалось 2 объекта. Теоретически, они должны существовать в разных потоках, т.к. модель tmApartment.

    3. Клиенты вызывают метод сервера, который возвращает идентификатор главного потока  .

    Как заставить сервер работать в модели tmApartment?

    Код сервера:


    type
     TApServer = class(TAutoObject, IApServer)
     protected
       function GetThreadID: Integer; safecall;
     end;

    implementation

    uses ComServ, Windows;

    function TApServer.GetThreadID: Integer;
    begin
     Result := GetCurrentThreadID;
    end;

    initialization
     TAutoObjectFactory.Create(ComServer, TApServer, Class_ApServer,
       ciMultiInstance, tmApartment);



    Код клиента:


    type
     TForm3 = class(TForm)
       Button1: TButton;
       procedure FormCreate(Sender: TObject);
       procedure Button1Click(Sender: TObject);
     private
       FServer: Variant;
     end;

    var
     Form3: TForm3;

    implementation

    {$R *.dfm}

    procedure TForm3.FormCreate(Sender: TObject);
    begin
     FServer := CreateOLEObject('ApartmentServer.ApServer');
    end;

    procedure TForm3.Button1Click(Sender: TObject);
    begin
     MessageDlg(IntToStr(FServer.GetThreadID), mtWarning, [mbOK], 0);
    end;


  • Сергей М, (12.05.08 19:45) [1]

    > который возвращает идентификатор главного потока


    Главного потока какого процесса ?
    У тебя в этой схеме минимум два процесса (процессы контроллеров при InProc-сервере)
  • dem (13.05.08 18:51) [2]
    Это внешний сервер. Возвращается ИД его главного потока. Вот исходник: http://get.freesoft.ru/?id=29394
  • Сергей М, (13.05.08 19:16) [3]
    И что ?

    Ты же сам написал ciMultiInstance, а теперь вдруг удивляешься, почему по запросам двух разных процессов-контроллеров было создано два процесса-сервера
  • dem (14.05.08 19:05) [4]
    Да нет, при ciMultiInstance-то как раз создается один сервер на всех клиентов. Вот из хелпа по типу TClassInstancing: "The COM object is created as one of multiple instances within the same executable." В списке процессов видно, что процесс один, да и бряки ставил в сервере - внутри одного процесса создаются два объекта, оба в главном потоке. :(
 
Конференция "Corba" » Сервер tmApartment работает как tmSingle [Delphi, Windows]
Есть новые Нет новых   [134430   +4][b:0][p:0.001]