在TWebModule Handler中生成一个新的线程/进程

时间:2011-12-14 13:55:43

标签: delphi delphi-2007

我在Apache上运行了一个基于Delphi TWebModule ISAPI的项目。我的一个事件处理程序包含可能需要几分钟才能处理的逻辑。我想生成一个单独的进程/线程来执行逻辑并立即将html返回给浏览器。 html将有AJAX客户端调用来定期更新进程进度。

我尝试使用 TThread ,但发现它等待执行代码在返回之前结束。

示例:

  procedure Tmainweb.DoLongProcess(Sender: TObject; Request: TWebRequest;
    Response: TWebResponse; var Handled: Boolean);
  var
    ProcessThread: TProcessThread;
  begin
    ProcessThread := TProcessThread.Create(True);
    ProcessThread.Execute;
    Handled := True;
    Response.Content := '<html><body>Processing - would also include ajax stuff to get periodic updates</body></html>
  end;

TProcessThread 是我的处理线程,可能需要几分钟才能完成。当我运行这个应用程序时,我认为控制将在 ProcessThread.Execute 之后继续进行。但事实并非如此。而是等待执行过程中的代码完成。

我怎样才能做到这一点?如何生成异步进程以使浏览器不处于等待状态?

2 个答案:

答案 0 :(得分:2)

没有足够的信息来提供正确答案,但我假设TProcessThread以某种方式从TThread继承。如果是,则创建线程然后启动它。 execute方法将在子线程中调用,不能直接调用。

ProcessThread.FreeOnTerminate := True
ProcessThread.Start() // Later versions of Delphi
//or  ProcessThread.Resume;  in earlier versions of Delphi to start a suspended thread

答案 1 :(得分:2)

转向Darian的回答。 这是一个回答你问题的例子:

type
  TProcessThread = class(TThread)
  protected 
    procedure Execute; override;
  public
    constructor Create;
  end;

constructor TProcessThread.Create;
begin
 inherited Create( false);
 Self.FreeOnTerminate := true;
end;

procedure TProcessThread.Execute;
begin
  while not Self.Terminated do begin
    {- Do some heavy work }
  end;
  {- free by myself at last ! }
end;

-

// In your TmainWeb.DoLongProcess
ProcessThread := TProcessThread.Create; // Thread will free itself when ready.
Handled := True;