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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2013, 16:01   #1
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию TIdTCPServer грузит процесоор

Добрый день!
Вопрос такой: Сервер и клиент в одном процессе. При подключении клиента (idtcpclient) процесс начинает жрать 50% процессорного времени (2хядерный проц).

С чем это может быть связано? Обработчик OnExecute пустой... Пишу с работы, нет возможности описать всё подробно... Хотел бы услышать ваши предположения, пока не разберусь сам)
Hottabych вне форума Ответить с цитированием
Старый 12.09.2013, 16:22   #2
ZuBy
Участник клуба
 
Аватар для ZuBy
 
Регистрация: 29.09.2008
Сообщений: 1,234
По умолчанию

код показывай
ZuBy вне форума Ответить с цитированием
Старый 12.09.2013, 16:34   #3
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Покажу вечером, пока описываю общими словами, проблему телепатов понимаю, поэтому прошу какого-нить намека на известные грабли при работе с idtcp, при которых поток уходит в завис и жрет 100% времени процесса.
Hottabych вне форума Ответить с цитированием
Старый 12.09.2013, 23:02   #4
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Делаю классы-обертки для вышеуказанных компонентов. Для удобства и унификации для последующих приложений. Код примитивный (в данном случае), типа IdTCPServer.Active:=true, IdTCPClient.Connected;

Похоже, что это проблема TIndy, т.к. запустил откомпиленные exe-шники из примеров по indy (чат) - та же самая картина - при подключении клиента сервер начинает жрать машинное время.
Кто что думает по этому поводу?
Hottabych вне форума Ответить с цитированием
Старый 13.09.2013, 08:09   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Кто что думает по этому поводу?
Инди какой версии? Я использую 10-ю, таких проблем не наблюдаю.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 13.09.2013, 11:52   #6
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Версия 10, rad xe4
Может быть нужно как-то управлять выполнением потоков? Очень похоже на то, что при подключении клиента в новом потоке начинает выполняться в бесконечном цикле OnExecute со своими проверками наличия соединения и т.п., что и приводит к сабжу. Хотя, в принципе, так и задумано... В общем, я в раздумье, куда копать.
ps. У меня обработчик OnExecute пустой.
pps. Появилась идея отбилдить в release конфигурации, может поможет.

Да ну нафиг, Stilet, я же писал выше:
Цитата:
т.к. запустил откомпиленные exe-шники из примеров по indy (чат) - та же самая картина - при подключении клиента сервер начинает жрать машинное время.
Причем скачал вообще случайный архив с исходниками и бинарниками откуда-то с форума.

Эти самые экзешники проверял на разных компах - результат тот же самый.
Насколько я понял, есть такой код:
Код:
procedure TIdThread.Execute;
begin
  // Must make this call from INSIDE the thread. The call in Create
  // was naming the thread that was creating this thread. :(
  //
  // RLebeau - no need to put this inside the try blocks below as it
  // already uses its own try..except block internally
  if Name = '' then begin
    Name := 'IdThread (unknown)';
  end;
  SetThreadName(Name);

  try
    BeforeExecute;
    try
      while not Terminated do begin
        if Stopped then begin
          DoStopped;
          // It is possible that either in the DoStopped or from another thread,
          // the thread is restarted, in which case we dont want to restop it.
          if Stopped then begin                        
            if Terminated then begin
              Break;
            end;
            // Thread manager will revive us
            {$IFDEF DEPRECATED_TThread_SuspendResume}
            Suspended := True;
            {$ELSE}
            Suspend;
            {$ENDIF}
            if Terminated then begin
              Break;
            end;
          end;
        end;

        Include(FOptions, itoReqCleanup);
        try
          try
            try
              BeforeRun;
              if Loop then begin
                while not Stopped do begin
                  try
                    Run;
                  except
                    on E: Exception do begin
                      if not HandleRunException(E) then begin
                        Terminate;
                        raise;
                      end;
                    end;
                  end;
                end;
              end else begin
                try
                  Run;
                except
                  on E: Exception do begin
                    if not HandleRunException(E) then begin
                      Terminate;
                      raise;
                    end;
                  end;
                end;
              end;
            finally
              AfterRun;
            end;
          except
            Terminate;
            raise;
          end;
        finally
          Cleanup;
        end;
      end;
    finally
      AfterExecute;
    end;
  except
    on E: Exception do begin
      FTerminatingExceptionClass := E.ClassType;
      FTerminatingException := E.Message;
      DoException(E);
      Terminate;
    end;
  end;
end;
Который выполняется в потоке созданного контекста. И все ресурсы забирает цикл
Код:
if Loop then begin
                while not Stopped do begin
                  try
                    Run;
                  except
                    on E: Exception do begin
                      if not HandleRunException(E) then begin
                        Terminate;
                        raise;
                      end;
                    end;
                  end;
                end;
Короче, ухожу я с инди, наверное, буду изобретать велосипед или скачивать ics)

Последний раз редактировалось Stilet; 14.09.2013 в 10:09.
Hottabych вне форума Ответить с цитированием
Старый 14.09.2013, 10:17   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
И все ресурсы забирает цикл
Не удивительно. Поставь в него sleep(10) и нагрузка упадет.
Цитата:
Да ну нафиг
Я не спорю с тобой, примеры тоже могут быть далеки от идеала.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.09.2013, 11:26   #8
Hottabych
Форумчанин
 
Регистрация: 13.01.2008
Сообщений: 140
По умолчанию

Stilet, спасибо, о sleep я как-то не подумал)
Hottabych вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблеми з TIdTcpServer(Delphi); Balanar Помощь студентам 0 10.07.2011 02:33
Почему tIdTCPServer железно цепляется к порту Altera Работа с сетью в Delphi 13 06.01.2011 05:58
Логироване работы TIdTCPServer, проблема с синхронизацией Altera Работа с сетью в Delphi 0 05.09.2010 19:42
Проблема с кодировкой в TIdTCPServer&TIdTCTClient RNT Работа с сетью в Delphi 6 08.07.2009 14:34
Проблема с TidTCPServer andrey4623 Работа с сетью в Delphi 3 18.08.2008 09:15