Newsgroups : Borland : borland.public.delphi.internet.winsock : 2008 Feb : ThreadClass exception

www.cryer.info
Managed Newsgroup Archive

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?

Replies:

www.cryer.info
Managed Newsgroup Archive