Вопрос

Я использую компонент TIdCmdTCPServer Indy 10 для реализации моего клиент-серверного приложения.Проблема в том, что запрос от клиентов может быть довольно сложным и что графическая часть моего серверного приложения немедленно теряет отзывчивость.Из Документация Indy, Я получил этот Инди:

Создает и запускает потоки прослушивателя для привязок, используя приоритет потока tpHighest.

Могу ли я изменить это поведение?

Это было полезно?

Решение

Как указал Роб, не меняйте приоритет потока-слушателя, вместо этого понизьте приоритет рабочих потоков.К нему можно получить доступ в OnConnect() Включить соединение() обработчик Сервер TIdCmdTCPСервер например, вот так:

procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
  // sanity checks need to go here
  TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;

Другие советы

Установка более низкого приоритета для прослушивающего потока не решит вашу проблему.Все, что делает поток прослушивателя, - это прослушивание, которое не требует больших затрат процессора.Пока не установится соединение, этот поток вообще ничего не делает.Возможно, вы сможете подтвердить это с помощью такого инструмента, как Process Explorer;Я думаю, что это может показать загрузку процессора по потокам.

Установка более низкого приоритета на самом деле может привести к появлению вашего сервера Меньше отзывчивый, потому что при поступлении соединения поток, прослушивающий это соединение, будет выполняться с более низким приоритетом и не сможет немедленно работать с соединением.Клиенту придется немного подождать, прежде чем ваш сервер начнет обрабатывать его запрос.

Запросы не обрабатываются в потоке прослушивателя.Поток-слушатель делегирует большую часть работы другим потокам.Если у вас есть только одна привязка TCP, то у вас будет только один поток прослушивателя, но вы можете обрабатывать множество одновременных подключений.Каждое соединение будет обрабатываться отдельным потоком, несмотря на наличие только одного прослушивателя.

В любом случае, вы можете изменить приоритет, обработав серверный объект OnBeforeListenerRun событие.Он получает ссылку на TIdThread который представляет поток прослушивателя, поэтому вы можете присвоить другое значение его Priority собственность.Кроме того, у вас есть исходный код, так что вы могли бы зайти и изменить определение tpListener постоянная в IdGlobalCore.pas IdGlobalCore.pas.Код использует это значение, а не tpHighest напрямую.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top