リモートデータモジュール(多層サポート)でマルチスレッドを実現するには?


つっちー  2005-10-22 01:13:33  No: 18205

掲題の件についてご質問があります。

<環境>
C/Sアプリ共通
Windows2000+Delphi7+DCOM
※三層構造を想定

<質問内容>
複数クライアントからの要求をサーバ側をマルチスレッドにして対応させようと、開発しています。

クライアントA、クライアントBの両方からサーバへ要求した場合、
クライアントAが終了するまでクライアントBが待機状態になってしまいます。

TComponentFactoryに指定しただけでは不十分ですか?
問題ないのであれば、どのタイミングでスレッドが生成されるのでしょうか?
TThreadの情報はHPにあるんですけど・・・。

ご指南、ご指摘の程お願い致します。

※ソース(サーバ側)は下記の通りです。
//SOURCE START----->
unit USVR_1;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  Windows, Messages, SysUtils, Classes, ComServ, ComObj, VCLCom, DataBkr,
  DBClient, StdVcl, FMTBcd, DB, SqlExpr, Provider, DBXpress;

type
  TSVR_1 = class(TRemoteDataModule, ISVR_1)
    Provider1 : TProvider;
    Query1    : TSQLQuery;
    procedure GetDataBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant);
  private
    FParam1: TString;
    FParam1: TString;
  protected
    class procedure UpdateRegistry(Register: Boolean; const ClassID, ProgID: string); override;
    procedure SetParam(AParam1, AParam2 : WideString); safecall;
  public
    { Public 宣言 }
  end;

implementation

{$R *.DFM}

class procedure TSVR_1.UpdateRegistry(Register: Boolean; const ClassID, ProgID: string);
begin
  if Register then
  begin
    inherited UpdateRegistry(Register, ClassID, ProgID);
    EnableSocketTransport(ClassID);
    EnableWebTransport(ClassID);
  end else
  begin
    DisableSocketTransport(ClassID);
    DisableWebTransport(ClassID);
    inherited UpdateRegistry(Register, ClassID, ProgID);
  end;
end;

//*****************************************************************//
// パラメータ設定
//*****************************************************************//
procedure TSVR_1.SetParam(AParam1, AParam2 : WideString);
begin
  FParam1 := AParam1;
  FParam2 := AParam2;
end;

//*****************************************************************//
// データ取得イベント
//*****************************************************************//
procedure TSVR_1.GetDataBeforeGetRecords(Sender: TObject; var OwnerData: OleVariant);
var
  WkProvider: TProvider;
  WkQuery   : TSQLQuery;

begin

  WkProvider := Provider1;
  WkQuery    := Query1;
  
  WkQuery.Close;
  WkQuery.SQL.Clear;
  
  WkQuery.SQL.Add('〜〜〜SQL文〜〜〜');
  
  try
    try
      WkQuery.Open;
      WkProvider.DataSet := WkQuery;
    except
      on e1: Exception do 
             begin
               //エラーログ出力
             end;
    end;
  finally
    WkQuery.Close;
  end;

end;

initialization
  TComponentFactory.Create(ComServer, TSVR_1, Class_SVR1, tiInstance, tmFree);
end.
<-----SOURCE END


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加