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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.03.2011, 10:35   #1
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию Тормоза при работе с TcpClient и TcpServer

Для организации передачи сообщений с сервера приложений клиентам на сервере использую TcpClient, на клиентах TcpServer. Передача сообщений клиентам реализована в цикле по клиентам с использованием потока (код ниже). ThreadList использую по выходу из сервера приложений для уничтожения не завершенных потоков. Проблемы начинаются в случае, если среди клиентов, которым передаются сообщения есть мертвые. На сервере приложений начинаются жуткие тормоза. Отладить в боевой обстановке, когда сообщение передается одновременно 20-30 клиентам практической возможности нет. С потоками работаю редко, с TcpClient и TcpServer вообще на Вы. Наверно в коде что-то не то делаю. Поделитесь пожалуйста идеями и предложениями
Код:
unit UMessageToUser;

interface

uses
  Classes, Sockets, Forms, SysUtils;

type
  TMessageToUser = class(TThread)
  private
    fThreadList: TThreadList;
    fTcpClient: TTcpClient;
    fText: String;
    fIPadres: String;
    fServer,fOk: Boolean;
    fEndMessages: TNotifyEvent;
    procedure MessageToUserTerminate(Sender: TObject);
    procedure MessageToUserEnd;
  protected
    procedure Execute; override;
  public
    constructor Create(IPadres,Text: String; Port: Integer;
      ThreadList: TThreadList; Server: Boolean; EndMessages: TNotifyEvent);
    destructor Destroy; override;
    property Ok: Boolean read fOk;
    property IPadres: String read fIPadres;
  end;

implementation

uses USysProc;

constructor TMessageToUser.Create(IPadres,Text: String; Port: Integer;
      ThreadList: TThreadList; Server: Boolean; EndMessages: TNotifyEvent);
begin
  inherited Create(True);
  fThreadList:=ThreadList;
  fThreadList.Add(Self);
  fTcpClient:=TTcpClient.Create(Application);
  fTcpClient.BlockMode:=bmBlocking;
  fTcpClient.RemoteHost:=IPadres;
  fTcpClient.RemotePort:=IntToStr(Port);
  fText:=Text;
  fIPadres:=IPadres;
  fServer:=Server;
  fEndMessages:=EndMessages;
  fOk:=False;
  FreeOnTerminate:=True;
  OnTerminate:=MessageToUserTerminate;
  Resume;
end;

destructor TMessageToUser.Destroy;
begin
  if fTcpClient.Connected then fTcpClient.Disconnect;
  fTcpClient.Free;
  inherited Destroy;
end;

procedure TMessageToUser.Execute;
var s: String;
begin
  try
    if fTcpClient.Connect then begin
      while fText<>'' do begin
        s:=spGetStroka(fText,#2);  //моя процедура для выдергивания строк из сообщения
        fTcpClient.Sendln(s);
      end;
      fOk:=True;
    end;
  except
  end;
end;

procedure TMessageToUser.MessageToUserTerminate(Sender: TObject);
begin
  if fServer then Synchronize(MessageToUserEnd);
  try
    fThreadList.Remove(Self);
  except
  end;
end;

procedure TMessageToUser.MessageToUserEnd;
begin
  if Assigned(fEndMessages) then fEndMessages(Self);
end;

end.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi2010 tcpServer/tcpClient потери сообщений при передаче loran Работа с сетью в Delphi 8 02.02.2011 12:00
TCPServer, TCPClient seobot Общие вопросы Delphi 2 03.05.2010 23:56
Передача файлов(exe) при помощи TCPServer и TCPClient Air Работа с сетью в Delphi 6 26.12.2008 23:26
TcpClient и TcpServer DOLBY Работа с сетью в Delphi 5 17.12.2007 10:43
TCPServer и TCPClient Antoha Работа с сетью в Delphi 19 06.10.2007 12:01