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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.05.2017, 20:20   #1
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
Стрелка Почему мой TCP сервер на Delphi, грузит процессор 10% на клиента

Решил написать, многопоточный сервер, на IdTcpServer.
Чтобы получить многопоточность, я из OnExecute вызываю функцию, а из нее другую,
в зависимости от запроса, передаю в качестве параметров записи типа record,
которые состоят из параметров String, Integer, Array [...] of String/Integer.
При запуске приложения ЦП = 0%, память 1.9 мб,
после подключения ЦП = 6-11%, память 2.2мб,
второе подключение ЦП = 18-22%, память 2.4 мб
Насколько я знаю все должно укладываться в 1%,
Подскажите что я не так делаю, в какую сторону копать?
Тут показано как я построил проект
Код:
    unit Unit1;

    implementation

    uses myTypes, Unit2;

    procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
    var
      Request : String;
      GetRespons: RGetRespons;
      Respons : ZRespons;
    begin
      Respons := GetRespons.ResponsCreate(Request);
    end;
    end.
    
    unit Unit2;

    uses myTypes;

    type
      RGetRespons = record
        function ResponsCreate(Request: String): ZRespons;
      private
        function RequestPars(Request: String): ZParsedRequest;
      end; 

    implementation

    uses Unit3;

    function RGetRespons.ResponsCreate(Request: String): ZRespons;
    var
      ParsedRequest: ZParsedRequest;
      iParam1: String;
      iParam2: Integer;
      Calculate: RCalculate;
    begin
      ParsedRequest := RequestPars(Request);  
      if ParsedRequest.Param1 then
      begin
        iParam1 := Calculate.NewFunc(ParsedRequest);
    	iParam2 := 
      end;   
      Result.Param1 := iParam1;
      Result.Param2 := iParam2;
    end;

    function RGetRespons.RequestPars(Request: String): ZParsedRequest;
    begin
      Result.Param1 := Value1;
      Result.Param2 := Value2;
      Result.Param3 := Value3;
    end;
    end.
    
    unit Unit3;

    uses myTypes;

    type
      RCalculate = record
        function NewFunc(ParsedRequest: ZParsedRequest;): String;
      end;

    implementation

    uses Unit4, Unit5;

    function RCalculate.NewFunc(ParsedRequest: ZParsedRequest;): String; 
    var
      ReadDB: RReadDB;
      UpdateDB: RUpdateDB;
      iParam: String;
    begin
      iParam := ReadDB.Read(ParsedRequest.Param2)
      ...
      UpdateDB.Update(ParsedRequest.Param2, iParam);
      Result := iParam;
    end;  
    end.
      
    unit Unit4; 

    uses myTypes;

    type
      RReadDB = record
        function Read(Name: String): String;
      end; 

    implementation

    uses Unit1; 

    function RReadDB.Read(Name: String): String;
    begin
      Form1.FDQuery1.SQL.Add('SELECT * FROM `table` WHERE `name` = "' + Name + '" LIMIT 1 LOCK IN SHARE MODE');
      Result := Form1.FDQuery1.FieldByName('col1').AsString;
    end;
    end.
      
    unit Unit5; 

    uses myTypes;

    type
      RUpdateDB = record
        function Update(Name, Value: String): Boolean;
      end; 

    implementation

    uses Unit1; 

    function RUpdateDB.Update(Name, Value: String): Boolean;
    begin      
      Form1.FDQuery1.SQL.Add('UPDATE LOW_PRIORITY `table` SET'
            + ' `col1` = "' + Value + '"'
            + ' WHERE `name` = "' + Name + '" LIMIT 1');
      Result := True;
    end;
    end.
    
    unit myTypes;

    type
      ZRespons = record
    	Param1: String;
    	Param2: Integer;
      end;
    type

      ZParsedRequest = record
    	Param1: Boolean;
    	Param2: String;
    	Param3: Array [0..5] of String;
      end;

    implementation

    end.
VirusN13

Последний раз редактировалось ArtGrek; 17.05.2017 в 21:11.
ArtGrek вне форума Ответить с цитированием
Старый 19.05.2017, 01:42   #2
ArtGrek
DelphiProger
Участник клуба
 
Аватар для ArtGrek
 
Регистрация: 14.11.2010
Сообщений: 1,023
По умолчанию

В OnExecute в конец процедуры нужно добавить sleep(10) и проблема решена.
VirusN13
ArtGrek вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Цикл грузит процессор и жрет память. DIgorevich Общие вопросы Delphi 3 29.07.2015 10:44
while грузит процессор overhandos Общие вопросы C/C++ 9 09.05.2012 20:31
Грузит процессор на 50% Vikup Microsoft Office Excel 2 26.04.2012 08:50
Timer и advstring1DrawCell грузит процессор designer999 Общие вопросы Delphi 10 04.09.2011 13:48
как создать TCP клиент, TCP сервер ? DreamMaster911 C/C++ Сетевое программирование 1 26.10.2010 15:05