TServerSocket.OnClientConnect

0

Mam następująco zdefiniowaną klasę:

TComunicator = class (TComponent)
  procedure ClientRead(Sender :TObject; Socket :TCustomWinSocket);
  procedure ClientConnect(Sender :TObject; Socket :TCustomWinSocket);
  procedure ThreadStop(Sender :TObject; Thread :TServerClientThread);
public
  Client :TClientSocket;
  Server :TServerSocket;

  constructor Create(Owner :TComponent; HostIP :string; HostPort :Integer; LocalPort :Integer); overload;
  destructor Destroy; overload;
end;

procedure TComunicator.ClientRead(Sender :TObject; Socket :TCustomWinSocket);
begin
  ...
end;

procedure TComunikator.ClientConnect(Sender :TObject; Socket :TCustomWinSocket);
begin
  ...
end;

procedure TComunicator.ThreadStop(Sender :TObject; Thread :TServerClientThread);
begin
  raise Exception.Create('Utracono połączenie!');
end;

constructor TComunicator.Create(Owner :TComponent; HostIP :string; HostPort :Integer; LocalPort :integer);
var retry :integer;
begin
  inherited Create(Owner);
  Server := TServerSocket.Create(Owner);
  Server.Port:=LocalPort;
  Server.OnClientRead := ClientRead;
  Server.OnClientConnect := ClientConnect;
  Server.OnThreadEnd := ThreadStop;
  Server.Active := true;
  Client := TClientSocket.Create(Owner);
  Client.Address:=HostIP;
  Client.Port:=HostPort;
  Client.Open;
end;

destructor TComunicator.Destroy;
begin
  Client.Active:=false;
  Client.Free;
  Server.Active:=false;
  Server.Free;
end;

Obiet tej klasy jest składnikiem klasy TThread. Teoretycznie wszystko powinno działać. Niestety zdarzenie OnClientConnect i OnClientRead nigdy nie jest wywoływane (pomimo łączenia się i wysyłania danych na wyznaczonym porcie). Z ciekawości dodałem zdarzenie on ThreadStop i ono jest wywoływane. Nie mam pojęcia, czemu tak się dzieje...

0

Nie mówcie mi, że nikt nie ma żadnego pomysłu! Przecież to musi działać... Błagam o szybką pomoc, bo inaczej czeka mnie dzisiaj nocka w firmie...

0

Najpierw chciałbym wszystkim podziękować za pomoc. Potem chciałym podać rozwiązanie, które znalazłem. TKomunikator był tworzony w procedurze Execute wątku. Przeniesienie TKomunikator.Create do konstruktora wątku rozwiązało problem. Nie pytajcie jednak dlaczego - wpadłem na to przypadkiem...

1 użytkowników online, w tym zalogowanych: 0, gości: 1