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
cscx.Enter; //进入隔离区
try
try
begin
query(sl.Strings[2],athread); //query为自定义函数,用adoquery查询
end
except
.....
end;
finally
cscx.leave;
end;
end;
freeandnil(sl);
end;
end;//query函数
query(data:string;athread:TIdPeerThread);
var
data:string; //查询到的数据
begin
//进行数据库查询
.......
athread.connection.write(data);
.......
end;
//因为使用adoquery对数据库进行查询,adoquery不是线程安全,所以用tcriticalsection进行线程保护,当多个客户端连接过来,并进行数据查询,运行一段时间以后,程序会出错,出错以后,客户端还可以连接上服务器端,经过多次测试,发现错误出在athread.connection.write(data)这一句,也就是说运行一段时间以后,会有向客户端发不出去数据的情况,造成一个线程卡在这里了,不能leave; 其它的线程就只能等。但是现在就是不知道,当write发送不出数据的时候,怎么办,是一直等,还是会引发什么异常?还是有其它的处理办法? 请大家帮帮忙
但不能再行数据查询了,这时当客户端再发查询的命令过来,就会运行到memo1.Lines.Add('1:-----进入保护区'+'); 这条语句就不再继续运行了? 不知道是什么原因,看上去像是cs.enter的时候出了错,但cs.enter的时候我进行了异常保护,但运行的时候没有捕年捉到异常信息,不知道是什么原因,请大家帮着看看代码!!!! 多谢
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
cscx.Enter; //进入隔离区
try
try
begin
query(sl.Strings[2],athread); //query为自定义函数,用adoquery查询
end
except
.....
end;
finally
cscx.leave;
end;
end;
freeandnil(sl);
end;
end;//query函数
query(data:string;athread:TIdPeerThread);
var
data:string; //查询到的数据
begin
//进行数据库查询
.......
athread.connection.write(data);
.......
end;
//因为使用adoquery对数据库进行查询,adoquery不是线程安全,所以用tcriticalsection进行线程保护,当多个客户端连接过来,并进行数据查询,运行一段时间以后,程序会出错,出错以后,客户端还可以连接上服务器端,经过多次测试,发现错误出在athread.connection.write(data)这一句,也就是说运行一段时间以后,会有向客户端发不出去数据的情况,造成一个线程卡在这里了,不能leave; 其它的线程就只能等。但是现在就是不知道,当write发送不出数据的时候,怎么办,是一直等,还是会引发什么异常?还是有其它的处理办法? 请大家帮帮忙
但不能再行数据查询了,这时当客户端再发查询的命令过来,就会运行到memo1.Lines.Add('1:-----进入保护区'+'); 这条语句就不再继续运行了? 不知道是什么原因,看上去像是cs.enter的时候出了错,但cs.enter的时候我进行了异常保护,但运行的时候没有捕年捉到异常信息,不知道是什么原因,请大家帮着看看代码!!!! 多谢
解决方案 »
- 动态创建窗口,如何指定其OnShow过程?
- 100分发个帖子问问-最近有个小应用,需要操作MySQL数据库。手头用的是D6,MySQL版本是5x。是不是D6、D7的DBExpress只支持到MySQL的3.23
- 过年放假,散分!祝各位happy new year!
- 在同一个框架中显示HTML的图标文件,点击后如何参数化调用程序?〈仿吉胜人事工资管理〉?急
- 急救help~delphi里面的鼠标右击事件是哪个过程阿?
- 关于IdTCPServer的问题
- 一个小问题,高手帮忙看看~~~
- 请问把label和datepiker 放进groupbox里为什么都看不见?
- 难道就没有高手了吗?
- 求助 SQL打不开是为什么呀。。。
- stack overflow,怎么解决啊?
- Delphi中DBGrid汇总小数点位数控制?
其实只用做一点调整就行了,你的查询做如下调整:
query(data:string;athread:TIdPeerThread);
var
data:string; //查询到的数据
begin
//.保护区开始......
进行数据库查询
数据打包到data中
//.保护区结束......
athread.connection.write(data); end;