idTcpServer共有几个线程(都已连接),在onExecute 中我参看indy的demo那样,用循环来访问每个连接,用writebuffer来发送,无问题,但一调用readbuffer后,虽不报错,但被调的那个线程就死了,是不是要用临界区还是什么呢?苦思不得其解。我的原意是:用一个连接来连接管理员,用其他连接来连接用户,当idTcpServer收到管理员指令的时候,即转发给其他连接上的用户,并读取该用户的返回值,并回发给管理员。现在管理员与用户端的代码均无错误,只是在 onExecute 中我一调用readbuff即该连接的线程就死了,不明白?还需老大们多指导!

解决方案 »

  1.   

    最好用线程锁,否则很容易造成死锁导致系统崩溃。
    var
    FLock:TCriticalSection;//互斥类,用于线程互斥访问在 TForm1.FormCreate
    FLock:=TCriticalSection.Create;
    在线程里
    FLock.Enter;...你的代码FLock.Leave;
      

  2.   

    procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
    begin
      with AThread.Connection do
      begin
        ReadBuffer( ........ );
      end;
    end;
      

  3.   

    你也可以使用TThreadList来保存AThread,它是线程安全的
      

  4.   

    首先,每个客户端连接线程都要保存到TThreadList里面来方便调用
    其次,你用readbuffer干什么,那个是接受客户端发送的信息的,然后解析收到的信息
    你在接受的地方用readbuffer就会等待接受客户端发来的信息,所以你认为线程死了,其实一直在等待状态