Создание нового потока / процесса в TWebModule Handler - PullRequest
2 голосов
/ 14 декабря 2011

У меня есть проект Delphi TWebModule ISAPI, работающий на Apache.Один из моих обработчиков событий содержит логику, обработка которой может занять несколько минут.Я хотел бы создать отдельный процесс / поток для выполнения логики и немедленного возврата html обратно в браузер.Html будет иметь вызовы на стороне клиента AJAX для получения периодических обновлений прогресса процесса.

Я пытался использовать TThread , но обнаружил, что ждет код Execute дляконец перед возвратом.

Пример:

  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 ]

2 голосов
/ 14 декабря 2011

Просто крутится на ответе Дариана. Вот пример, который отвечает на ваш вопрос:

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 голосов
/ 14 декабря 2011

Недостаточно информации, чтобы дать правильный ответ, но я предполагаю, что 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
...