**********tidtcpserver多线程的问题,急急急,在线等(没分了)

Description of your first forum.

**********tidtcpserver多线程的问题,急急急,在线等(没分了)

帖子hardblue » 星期六, 2005年11月5日 11:35


var
 cs:tcriticalsection;
implementation

//tidtcpserver的execute 事件中的代码如下:
procedure TForm1.serverExecute(AThread: TIdPeerThread);
 var
   r_data:string;        //接收的字符串
   sl:tstringlist;       //分隔接收数据为各个字段
   lenstr:string;        //pklen:数据长度字段
   package_len:integer;  //数据包长度 = 去掉pklen字段以后的长度
 begin
   with athread.Connection do
     begin
       sl:=tstringlist.Create;   //创建tstringlist
       lenstr:= readstring(4);   //读取数据长度
       try
         package_len := delphi.com/topic_517072_5d37.htm">StrToInt (lenstr);
       except
         begin
          console.Lines.Add('接收数据长度错误!');
          exit ;
         end;
       end;
       r_data := readstring(package_len);    //读取数据包
       sl:= split(r_data,'|');               //将各个字段分解出来
       
       if sl.Strings[1] = '1111' then        //查询操作
         begin            
            try
               begin
                 memo1.Lines.Add('1:-----进入保护区'+');  
                 cscx.Enter;  //线程保护                   //这里应该是出错的地方
                 memo2.Lines.Add('2:-----进入保护区成功');
               end;
            except
               begin      
                 ......
               end;
            end;
            query(sl.Strings[2],athread); //query为自定义函数,使用adoquery进行数据查询
            r_data := '';
            cscx.Leave;
         end;      
         freeandnil(sl);
     end;
 end;
//因为使用adoquery对数据库进行查询,adoquery不是线程安全,所以用tcriticalsection进行线程保护,当多个客户端连接过来,并进行数据查询,运行一段时间以后,程序会出错,出错以后,客户端还可以连接上服务器端,但不能再行数据查询了,这时当客户端再发查询的命令过来,就会运行到memo1.Lines.Add('1:-----进入保护区'+'); 这条语句就不再继续运行了? 不知道是什么原因,看上去像是cs.enter的时候出了错,但cs.enter的时候我进行了异常保护,但运行的时候没有捕年捉到异常信息,不知道是什么原因,请大家帮着看看代码!!!! 多谢
 
 
 

**********tidtcpserver多线程的问题,急急急,在线等(没分了)

帖子masm » 星期六, 2005年11月5日 19:27


try
   try
   cscx.Enter;
   ....
   except
   ...
   end;
finally
cscx.Leave;
end;