2011-12-14 4 views
2

저는 Apache에서 실행되는 Delphi TWebModule 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.Content을 실행 한 후 제어가 계속 될 것이라고 생각했습니다. 그러나 그렇지 않습니다. 대신 코드 실행 절차를 완료 할 때까지 기다립니다.

어떻게하면됩니까? 브라우저가 대기 상태가되지 않도록 비동기 프로세스를 생성하는 방법은 무엇입니까?

+0

그냥 자바 스크립트/아약스 클라이언트 페이지를 봉사 할 수 없습니다 대신 긴 과정을 시작 -

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; 

가 : 는 여기에 귀하의 질문에 대한 대답 예입니다? –

+1

나는 그것을 시도 할 수 있었다고 생각한다. AJAX는 나에게 조금 새로운 것입니다. 그리고 이상적으로 나는 클라이언트가이 과정을 시작하는 것을 원하지 않을 것입니다. 오히려 서버 측에 의지 할 것입니다. –

+0

대답하기 전에 몇 가지 질문을하는 것이 중요합니다. 1. 웹 서버가 제공하는 웹 응용 프로그램이라고 가정합니다. 2. ISAPI 또는 CGI? –

답변

2

방금 ​​Darian의 답변에 회전합니다.

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

Ok - 여기 어딘가에 있습니다. "FreeOnTerminiate = True"를 포함하도록 자손 클래스를 수정했으며 CreateSuspended를 True에서 False로 변경했습니다. 전에 CreateSuspended = True로 생성자를 호출 한 다음 Execute를 호출했습니다. –

+0

Good, 스레드 클래스 자체에 의해 수행되므로 명시 적으로'Execute'를 호출하지 마십시오. –

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 
+0

TProcessThread 클래스를 찾을 수 없습니다. CodeGear Delphi 2007 코드를 모두 검색했습니다. –

+0

@Darian, 델파이 2007에는 아직''TThread.Start' (http://docwiki.embarcadero.com/VCL/en/Classes.TThread.Start)가 없습니다 (델파이 버전은이 질문에 빠졌습니다). 고정 :) – TLama

+1

일시 중단 된 스레드를 만들 필요가 없습니다. 쓰래드 생성 메소드 내에서'FreeOnTerminate : = True;'를 설정하면된다. –

관련 문제