我在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 之后继续进行。但事实并非如此。而是等待执行过程中的代码完成。
我怎样才能做到这一点?如何生成异步进程以使浏览器不处于等待状态?
答案 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;