スレッド化されたヘルパー オブジェクトを使用する 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 メソッド (そのスレッドのコンテキスト内で動作する必要があります) が呼び出されることはありません。