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>