2009-02-26 4 views
2

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

создает и запускает нити для переплетов с использованием приоритета потока tpHighest.

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

ответ

5

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

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

Это похоже на то, что я ищу. Я должен подождать до завтра, пока я не смогу его протестировать. Я оставлю здесь комментарий. Спасибо, в любом случае! – jpfollenius

+1

+1 Я только что протестировал его, и он отлично работает! Еще раз спасибо за вашу помощь! – jpfollenius

6

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

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

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

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

+0

Привет! Хорошо, я должен быть более ясным: на сервере есть небольшая часть GUI, которая должна оставаться отзывчивой. Итак, что я хочу (спасибо за указание, что вне btw), чтобы снизить приоритет потоков, созданных в ответ на запросы клиентов ... любой, кто это сделает? – jpfollenius

Смежные вопросы