2011-12-14 71 views
2

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

我一直在使用的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

你就不能提供网页,让的JavaScript/AJAX客户端发起的漫长的过程呢? – 2011-12-14 14:02:22

+1

猜猜我可以试试。 AJAX对我来说有点新鲜。理想情况下,我不希望客户发起这个过程。宁愿依靠服务器端来。 – 2011-12-14 14:13:25

+0

在回答之前,问一些问题很重要:1.我的假设是这是一个由Web服务器提供的Web应用程序吗? 2. ISAPI或CGI? – 2011-12-14 14:41:53

回答

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; 
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 
相关问题