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

  • 主题发起人 hardblue
  • 开始时间
H

hardblue

Unregistered / Unconfirmed
GUEST, unregistred user!
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 := 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的时候我进行了异常保护,但运行的时候没有捕年捉到异常信息,不知道是什么原因,请大家帮着看看代码!!!! 多谢
 
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 := 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的时候我进行了异常保护,但运行的时候没有捕年捉到异常信息,不知道是什么原因,请大家帮着看看代码!!!! 多谢
 
try
try
cscx.Enter;
....
except
...
end;
finally
cscx.Leave;
end;
 

Similar threads

S
回复
0
查看
958
SUNSTONE的Delphi笔记
S
S
回复
0
查看
779
SUNSTONE的Delphi笔记
S
S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
回复
0
查看
1K
天地弦
顶部