Greška se javlja samo ako je program primio poruku. Ako napravim Free prije prijema poruke, greška se ne javlja.
Javlja grešku:
... raised exception class EidSocketError with message 'Socket Error # 10004 Interupted system call.'
TIdUPDServer kreiram u proceduri;
Code:
procedure tMyThread.Create();
var Port: integer;
begin
inherited Create(CreateSuspended);
self.FreeOnTerminate := true;
...
Port := 6001;
OkPort := false;
while not OkPort do begin
fServer := TIdUDPServer.Create(nil);
fServer.DefaultPort := Port;
fServer.BufferSize := 8192;
fServer.IPVersion := Id_IPv4;
fServer.ThreadedEvent := false;
fServer.OnUDPRead := IdSUDPRead;
try
fServer.Active := true;
OkPort := true;
except
fServer.Active := false;
fServer.Free;
Port := Port + 1;
end;
end;
end;
procedure tMyThread.Create();
var Port: integer;
begin
inherited Create(CreateSuspended);
self.FreeOnTerminate := true;
...
Port := 6001;
OkPort := false;
while not OkPort do begin
fServer := TIdUDPServer.Create(nil);
fServer.DefaultPort := Port;
fServer.BufferSize := 8192;
fServer.IPVersion := Id_IPv4;
fServer.ThreadedEvent := false;
fServer.OnUDPRead := IdSUDPRead;
try
fServer.Active := true;
OkPort := true;
except
fServer.Active := false;
fServer.Free;
Port := Port + 1;
end;
end;
end;
U Try except isprobavam koji je port slobodan, nisam uspio nači drugi način, sigurno postoji... Možda netko zna kako ga dobiti?
Prijem poruke:
Code:
procedure tMyThread.IdSUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
var LMsg: string;
begin
if Length(Adata) > 0 then begin
lMsg := BytesToString(AData);
fPorukaPrijem.Append(BytesToString(AData));
end;
end;
procedure tMyThread.IdSUDPRead(Sender: TObject; AData: TBytes; ABinding: TIdSocketHandle);
var LMsg: string;
begin
if Length(Adata) > 0 then begin
lMsg := BytesToString(AData);
fPorukaPrijem.Append(BytesToString(AData));
end;
end;
Primeljana poruka se obrađuje u proceduri: tMyThread.Execute;
server destroy-am u destroy procedure threda:
Code:
destructor tMyThread.Destroy;
begin
fPorukaPrijem.Free;
if fClient.Connected then fClient.Active := false;
fClient.Free;
if fServer.Active then fServer.Active := false;
fServer.Free;
inherited;
end;
destructor tMyThread.Destroy;
begin
fPorukaPrijem.Free;
if fClient.Connected then fClient.Active := false;
fClient.Free;
if fServer.Active then fServer.Active := false;
fServer.Free;
inherited;
end;
Poruka o grešci se javi na retku: fClienat.Active := false;
[Ovu poruku je menjao franjo_tahi dana 03.12.2009. u 15:19 GMT+1]