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

  • 主题发起人 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.Connectiondo
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的时候我进行了异常保护,但运行的时候没有捕年捉到异常信息,不知道是什么原因,请大家帮着看看代码!!!! 多谢
 
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.Connectiondo
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的时候我进行了异常保护,但运行的时候没有捕年捉到异常信息,不知道是什么原因,请大家帮着看看代码!!!! 多谢
 
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
memo属于可视化vcl,对这些可视化vcl在多线程中的访问,最好采用同步控制,不是采用
临界区的办法。
 
A

adlyl031

Unregistered / Unconfirmed
GUEST, unregistred user!
好,帮顶


--------签名档---------------------------

比肩国内顶尖源码下载站点 -> 源码我爱你

http://www.source520.com
http://www.source520.net
80G源码电子书免费免注册下载,大量精辟技术文档库随时更新
******************************************************************
附:为了站点持续发展,现有本站近年来收藏的大量大型商业源码低价出售,
详情请进入以下链接查看:
http://www.source520.com/building_delphi.htm

浏览商业代码请从如下URL进入查看实物:
1.商业源码库1: ftp://source520see3:browse@61.152.199.245/
2.商业源码库2: ftp://source520see2:browse@61.152.199.245/
 

Similar threads

S
回复
0
查看
947
SUNSTONE的Delphi笔记
S
S
回复
0
查看
768
SUNSTONE的Delphi笔记
S
顶部