Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.07.2015, 11:54   #1
an_private
Пользователь
 
Регистрация: 17.10.2014
Сообщений: 17
По умолчанию TIdTelnetServer в INDY10 загружает процессор на простейшей задаче

Есть задача - машина-сервер, к которой по telnet подключаются клиенты. Всем подключенным клиентам отсылается одно и то же сообщение (текущий тайм-код, не суть) 25 раз в секунду.

Весь код сервера крутится в отдельном Thread'е.
Проблема в том, что каждый подключившийся клиент добавляет примерно 15% загрузки процессора Core i7 То есть выглядит это примерно так:
- нет клиентов, загрузка нулевая
- подключился первый клиент - загрузка 15%
- подключился второй клиент - загрузка 30%
и т.д.
Причём это не зависит от того - пересылаем мы что-нибудь по telnet или нет. Коннект произошёл - сразу загрузка процессора, независимо ни от чего.
Что это? Кто-нибудь сталкивался?
an_private вне форума Ответить с цитированием
Старый 30.07.2015, 13:08   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
25 раз в секунду.
Не многовато ли?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2015, 14:27   #3
an_private
Пользователь
 
Регистрация: 17.10.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Не многовато ли?
Неа. Передаётся тайм-код каждого кадра видео. 25 к/с - 25 посылок. В каждой посылке всего 12 байт.

Да и не в объемах дело. Я пробовал вообще ничего не пересылать - загрузка процессора всё равно начинается сразу после коннекта клиента.
an_private вне форума Ответить с цитированием
Старый 30.07.2015, 14:59   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Ну нужно смотреть код... Если у тебя цикл бесконечный или долгий, то понятно что грузить будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.07.2015, 15:58   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Поменяйте полярность, пускай клиенты запрашивают данные когда им это надо, а не сервер раздает бесконечность в бесконечность.
Человек_Борща вне форума Ответить с цитированием
Старый 30.07.2015, 16:15   #6
an_private
Пользователь
 
Регистрация: 17.10.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Ну нужно смотреть код... Если у тебя цикл бесконечный или долгий, то понятно что грузить будет.
Закомменчивание всего внутри while not Terminated do begin (исключая Sleep, конечно) нагрузку на проц не снижает. То есть даже если Telnet сервер крутится вхолостую - без какого-либо вмешательства с моей стороны - всё равно процессор грузится.

Код:
procedure NetThread.Execute;
var
  i: integer;
  ContextList: TList;
  tcstring: string;
begin
  IdTelnetServer := TIdTelnetServer.Create;
  IdTelnetServer.Bindings.Add.Port := MainUnit.ListenPort;
  IdTelnetServer.LoginMessage := 'timecode';

  IdTelnetServer.Active := true;

  while not Terminated do begin
    if MainUnit.NetTCisReady then begin
      ContextList := IdTelnetServer.Contexts.LockList;
      for i:=0 to ContextList.Count - 1 do begin
        with MainUnit.NetTC do begin
          tcstring := format('%2.2d:%2.2d:%2.2d:%2.2d',
            [Hours, Minutes, Seconds, Frames]);
        end;
        try
          TIdContext(ContextList.Items[i]).Connection.IOHandler.Writeln(tcstring);
        finally
        end;
      end;
      IdTelnetServer.Contexts.UnlockList;
      MainUnit.NetTCisReady := false;
    end;
    Sleep(20);
  end;

  ContextList := IdTelnetServer.Contexts.LockList;
  for i:=0 to ContextList.Count - 1 do begin
    try
      TIdContext(ContextList.Items[i]).Connection.Disconnect;
    finally
    end;
    Sleep(1000);
  end;
 IdTelnetServer.Contexts.UnlockList;
end;
Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Поменяйте полярность, пускай клиенты запрашивают данные когда им это надо, а не сервер раздает бесконечность в бесконечность.
Критична задержка между моментом прихода тайм-кода и получением его клиентом. Клиент не будет спрашивать данные каждые несколько миллисекунд.
Да и вообще это не при чём - сама выдача данных проц не нагружает - я уже писал об этом.

Последний раз редактировалось Stilet; 30.07.2015 в 16:51.
an_private вне форума Ответить с цитированием
Старый 30.07.2015, 16:21   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Цитата:
сама выдача данных проц не нагружает - я уже писал об этом.
зато while BOOLEAN нагружает хорошо так...
Цитата:
Клиент не будет спрашивать данные каждые несколько миллисекунд.
С чего бы это?
Принимать 25 в секунду можно, а просить нельзя? бред.

И ещё, сокет блокирующий али не?

Последний раз редактировалось Человек_Борща; 30.07.2015 в 16:25.
Человек_Борща вне форума Ответить с цитированием
Старый 30.07.2015, 16:34   #8
an_private
Пользователь
 
Регистрация: 17.10.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
зато while BOOLEAN нагружает хорошо так...
Никак не нагружает. Так как пока нет коннекта со стороны клиента - загрузка проца нулевая. А ведь цикл в это время точно также крутится.

Цитата:
С чего бы это?
Принимать 25 в секунду можно, а просить нельзя? бред.
С того, что просить надо будет не 25 раз в секунду, а минимум 100 - чтобы минимизировать время между моментом прихода свежего таймкода и моментом его получения клиентом. С инициацией обмена со стороны сервера этой задержки нет вообще - как только готов тайм-код - сразу выплюнули данные. Да и не при чём это тут вообще - какой смысл это обсуждать?

Цитата:
И ещё, сокет блокирующий али не?
А чёрт его знает - как там в инди реализовано. Вся инициализация сервера приведена в коде, то есть всё по умолчанию. Главное - даже если нет вообще никакого обмена со стороны приложения - загрузка проца всё равно есть.
an_private вне форума Ответить с цитированием
Старый 30.07.2015, 16:37   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Ещё у вас куча ошибок по написанию истинных многопоточных приложений, всего 1 правило, и оно святое: Внутри контекта потока существует только контекст потока, любые обращения за пределы потока происходят через методы синхронизации.

Цитата:
MainUnit.NetTCisReady := false;
завернуть в Synchronize.

Создать try/finally.

Цитата:
Никак не нагружает. Так как пока нет коннекта со стороны клиента - загрузка проца нулевая. А ведь цикл в это время точно также крутится.
вы поток создаете когда нет подключений? Если нет, понятное дело что загрузки не будет.

Цитата:
С того, что просить надо будет не 25 раз в секунду, а минимум 100 - чтобы минимизировать время между моментом прихода свежего таймкода и моментом его получения клиентом. С инициацией обмена со стороны сервера этой задержки нет вообще - как только готов тайм-код - сразу выплюнули данные. Да и не при чём это тут вообще - какой смысл это обсуждать?
Сдается мне, Вы задачу странно решаете. Опишите, зачем вам вообще такая точность?

Как минимум с того, что не убрав while false, от нагрузи вы не избавитесь.

Последний раз редактировалось Человек_Борща; 30.07.2015 в 16:42.
Человек_Борща вне форума Ответить с цитированием
Старый 30.07.2015, 17:13   #10
an_private
Пользователь
 
Регистрация: 17.10.2014
Сообщений: 17
По умолчанию

Всё, я разобрался. Оказывается TIdTelnetServer обязательно требуется обработчик OnExecute. Если он есть (даже пустой) - загрузка падает до нуля. Если его нет - что-то у него в мозгах портится. Добавил обработчик и всё прекрасно работает.
an_private вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Зацикливание простейшей программы. torren108 Помощь студентам 2 01.11.2011 19:02
литература про написание простейшей ос lem Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 5 30.09.2011 18:16
Графика. Функции простейшей САПР. Genco Общие вопросы по программированию, компьютерный форум 1 21.09.2011 10:31
Узнать на сколько загружает процессор какая-то программа.. Человек_Борща Общие вопросы Delphi 7 19.09.2010 13:30
Загрузка Windows. Процесс svchost загружает процессор на 100 % Манжосов Денис :) Windows 12 07.09.2010 14:27