Как изменить приоритет потока слушателя - PullRequest
2 голосов
/ 26 февраля 2009

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

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

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

Ответы [ 2 ]

6 голосов
/ 26 февраля 2009

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

procedure TServerForm.IdCmdTCPServer1Connect(AContext: TIdContext);
begin
  // sanity checks need to go here
  TIdYarnOfThread(AContext.Yarn).Thread.Priority := tpLower;
end;
6 голосов
/ 26 февраля 2009

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

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

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

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

...