Witam, jako ze TClientSocket gubi czasami pakiety zdecydowalem sie uzyc komponentow Indy. Wszystko ladnie zamienilem, pakiety nie znikaja... Do odbioru danych zrobilem nowy wątek. Tworzony jest automatycznie przy uruchomieniu programu a niszczony przy zamknieciu. Przy połączeniu z serwerem jest wznawiany (Watek.Resume) a po rozlaczeniu wylaczany (Watek.Suspend).

Tutaj kod:

type
  TConnectionThread = class(TThread)
  private
    { Private declarations }
    procedure OnLogin;
  protected
    procedure Execute; override;
  end;

procedure TMainForm.FormCreate(Sender: TObject);
begin
 CThread := TConnectionThread.Create(true);
end;

procedure TMainForm.FormDestroy(Sender: TObject);
begin
  CThread.Terminate;
  CThread.Free;
end;


procedure TMainForm.ClientConnected(Sender: TObject);
begin
  Debug('Connected!');
  CThread.Resume;
  SendPacket(C_LOGIN, edtLogin.text, edtPassword.text);
end;

procedure TMainForm.ClientDisconnected(Sender: TObject);
begin
  debug('Disconnected!');
  Cthread.Suspend;
end;

procedure TConnectionThread.Execute;
var
  pid: integer;
  function GetInt: integer;
  begin
    result := mainform.Client.ReadInteger(false);
  end;
  function GetStr(Bytes: integer = -1): string;
  begin
    if bytes = -1 then
      bytes := GetInt;
    result := mainform.Client.ReadString(bytes);
  end;
begin
  while not (application.Terminated) or (Terminated) do
  begin
    pid := GetInt;
        if pid > 0 then
          mainform.Debug(inttostr(pid));
    case pid of
    C_PING:
    begin
    //wyslij ponga itd
    end;
  end;
end;
end;

Tak to wygląda. I jest niby ok, tylko ze czasem wyskakuje błąd krytyczny wątka kiedy polacze/rozlacze sie pare razy. Ma ktos jakis pomysl jak to zrobic porzadnie z użyciem wątków ?</delphi>