Сервер многопоточности Delphi / Indy - PullRequest
1 голос
/ 10 января 2020

Я пытаюсь включить многопоточность моего приложения. Чего я хочу добиться: - получить команду через TidHTTPServer - выполнить локальное действие (может включать использование tidHTTP для отправки / получения данных в другие службы) - вернуть результат выполнения исходному вызывающему

, так как я довольно новичок в многопоточность Я хотел бы знать, верна ли моя идея дизайна

  1. TMsgHandler = Class (TThread)
  2. в TidHTTPServer.OnCommandGet Я создаю новый экземпляр TMsgHandler и передаю ARequestInfo и AResponseInfo
  3. TMsgHandler.Excecute интерпретируют данные
  4. Может ли TMsgHandler.Execeute использовать объекты (потомки TidHTTP) в моем Main для связи с другими службами?
  5. TMsgHandler отправляет ответ через AResponseInfo и завершается.

будет ли это работать?

1 Ответ

2 голосов
/ 10 января 2020

Это неправильный дизайн.

THTTPServer - многопоточный компонент. Его OnCommand... события запускаются в контексте рабочих потоков, которые Indy создает для вас.

Таким образом, вам не нужно извлекать TMsgHandler из TThread. Вместо этого выполните TIdHTTP непосредственно в контексте потока OnCommand.... Ответ не будет отправлен обратно клиенту, пока ваш обработчик событий не завершится (если вы не отправите его вручную). Однако вы не должны совместно использовать один TIdHTTP из основного потока (кроме случаев, когда это абсолютно необходимо, в этом случае вам необходимо синхронизировать доступ к нему). При необходимости вы должны динамически создавать новый TIdHTTP непосредственно в коде OnCommand... / TMsgHandler.

...