Newsgroups : Borland : borland.public.delphi.internet.winsock : 2008 Feb : ThreadClass exception
| Subject: | ThreadClass exception |
| Posted by: | "emre varol" (no..@none.com) |
| Date: | 8 Feb 2008 10:27:26 |
I use delphi5 and indy devsnapshot
Tperson = record
nick: String[ 15 ];
roomnumber: byte;
......
end;
TMyPeerThread = class(TIdPeerThread)
private
FQueue: TThreadList;
FWriteLock: TCriticalSection;
public
person: Tperson;
constructor Create(ACreateSuspended: Boolean = True);override;
destructor Destroy; override;
function AddToQueue(Stream: TStream): Boolean;
procedure SendQueue;
end;
constructor TMyPeerThread.Create(ACreateSuspended: Boolean);
begin
person.nick := '';
person.roomnumber := 200;
.....
inherited;
end;
function TMyPeerThread.AddToQueue(Stream: TStream): Boolean;
begin
Result := False;
if Stream <> nil then
begin
with FQueue.LockList do
try
try
Add( Stream );
Result := True;
except
end;
finally
FQueue.UnlockList;
end;
end;
end;
Troom = class
kritik: TCriticalsection;
persons: TThreadlist;
.......
.....
end;
rooms: array of Troom;
server: TidTcpserver
....
setlength( rooms, 10 );
//create rooms....
Server.ThreadClass := TMyPeerThread;
server.Active := true;
.....
procedure TfrmTcpserver.ServerConnect(AThread: TIdPeerThread);
begin
try
Athread.Connection.ReadTimeout := 25000;
Athread.data := nil;
TMypeerthread( Athread ).person.IP := AThread.Connection.Socket.Binding.PeerIP;
except
end;
end;
procedure TfrmTcpserver.ServerExecute( AThread: TIdPeerThread );
var firstbyte: byte;
begin
try
TMyPeerThread( AThread ).SendQueue;
if not AThread.Connection.IOHandler.Readable( 160 ) then Exit;
AThread.Connection.ReadBuffer( firstbyte, sizeof( firstbyte ) );
if firstbyte = 100 then Entertheroom( Athread )
else
if firstbyte = 101 then sendxx( Athread )
.....
except on e:exception do
if E is Eidexception then raise
else
frmserver.ExceptionLoga( e.message + ' boom1 ', 0 );//thread safed
end;
end;
procedure TfrmTcpserver.ServerDisconnect(AThread: TIdPeerThread);
var bb: byte;
begin
try
bb := TMypeerthread( Athread ).person.roomnumber;
if bb < length( rooms ) then
begin
rooms[ bb ].kritik.enter;
with rooms[ bb ].persons.locklist do
try
remove( Athread );
finally
rooms[ bb ].persons.unlocklist;
rooms[ bb ].kritik.leave;
end;
end;
........
except
end;
end;
procedure TfrmTcpserver.Entertheroom( Athread: tidpeerthread );
var Ath:Tmypeerthread;
bb: byte;
begin
Athread.connection.readbuffer( bb, sizeof( bb ) );
Ath := TMypeerthread( Athread );
if bb < length( roomss ) then
begin
rooms[ bb ].kritik.enter;
with rooms[ bb ].persons.locklist do
try
add( Athread );
finally
rooms[ bb ].persons.unlocklist;
rooms[ bb ].kritik.leave;
end;
end;
end;
procedure TfrmTcpserver.Sendxx( Athread: tidpeerthread );
var Ath, KAth:Tmypeerthread;
bb, rn: byte;
i: integer;
stream: Tmemorystream;
begin
Athread.connection.readbuffer( bb, sizeof( bb ) );
Ath := TMypeerthread( Athread );
rn := Ath.person.roomnumber;
if rn < length( rooms ) then
begin
rooms[ rn ].kritik.enter;
with rooms[ rn ].persons.locklist do
try
if count <> 0 then
for i := 0 to count - 1 do
if items[ i ] <> Athread then
begin
stream := Tmemorystream.create;
stream.writebuffer( bb, sizeof( bb ) );
KAth := TMypeerthread( items[ i ] );
try
KAth.AddToQueue( stream );
except on e:exception do .... ------>some times: Access violation at address 7C81A379 in module 'ntdll.dll'. Write of address 312E3843
end;
end;
finally
rooms[ rn ].persons.unlocklist;
rooms[ rn ].kritik.leave;
end;
end;
end;
spme times why this exception occur?