1

スレッド化されたヘルパー オブジェクトを使用する ISAPI 拡張 DLL があります。QA サーバーではスレッドが正常に実行されますが、ライブ サーバーでは実行されません。サーバー ハードウェアは、両方の環境で同じです。開発言語は Delphi XE2 です。

unit uRemoteTest2Intf;

interface
uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns;

type
  { Invokable interfaces must derive from IInvokable }
  IRemoteTest = interface(IInvokable)
  ['{9F4E3DF8-5D22-46FE-B3DC-B6CD8EE971AD}']
    function LogData(const Value: string): string; stdcall;
  end;

implementation

initialization
  InvRegistry.RegisterInterface(TypeInfo(IRemoteTest));

end.

unit uRemoteTest2Impl;

interface
uses Soap.InvokeRegistry, System.Types, Soap.XSBuiltIns, uRemoteTest2Intf, uThread;

type
  { TRemoteTest }
  TRemoteTest = class(TInvokableClass, IRemoteTest)
  private
    worker: TWorkerThread;
  public
    function LogData(const Value: string): string; stdcall;
    constructor Create; override;
    destructor Destroy; override;
  end;

implementation

uses
  uLog, Winapi.Windows, Winapi.Messages;

procedure RemoteTestFactory(out obj: TObject);
{$J+}
const
  iInstance: IRemoteTest = nil;
  instance: TRemoteTest = nil;
begin
  if instance = nil then
  begin
    instance := TRemoteTest.Create;
    instance.GetInterface(IRemoteTest, iInstance)
  end;
  obj := instance
end;

constructor TRemoteTest.Create;
begin
  inherited;
  //SetApplicationLogLevel(2);
  //SetApplicationLogFilename('c:\temp\test.txt');

  Log('Calling TRemoteTest.Create');
  worker := TWorkerThread.Create;
  worker.Start;
  if worker.Suspended then
    Log('worker is  suspended')
  else
    Log('worker is not suspended');

  Log('Called TRemoteTest.Create');
end;

destructor TRemoteTest.Destroy;
begin
  Log('Calling TRemoteTest.Destroy');
  worker.Free;
  inherited;
end;

function TRemoteTest.LogData(const Value: string): string;
begin
  Log('Calling TRemoteTest.LogData');
end;

initialization

InvRegistry.RegisterInvokableClass(TRemoteTest, RemoteTestFactory);

end.

unit uThread;

interface
uses
  System.Classes;

type
  TWorkerThread = class(TThread)
  protected
    procedure Execute; override;
  public
    constructor Create;
    destructor Destroy; override;
  end;

implementation

uses
  uLog;

constructor TWorkerThread.Create;
begin
  inherited Create(true);
  Log('Calling TWorkerThread.Create');
end;

destructor TWorkerThread.Destroy;
begin
  Log('Calling TWorkerThread.Destroy');
  inherited;
end;

procedure TWorkerThread.Execute;
begin
  NameThreadForDebugging('WorkerThread');
  Log('Executing Thread');
  while not Terminated do
  begin
    sleep(1000);
    Log('Executing thread');
  end;
  Log('Executed Thread');
end;

end.

{ログ プロシージャは、参照されている uLog.pas ファイル内の社内ログ ルーチンです}

IIS サーバーで、実行するコードの最後の部分は TWorkerThread.Start (メイン スレッド内) です。スレッドの Execute メソッド (そのスレッドのコンテキスト内で動作する必要があります) が呼び出されることはありません。

4

0 に答える 0