长时间运行 clientsocket 动态指针,静态数组,弹出错误对话框,程序自动关闭,程序无法响应的问题 ( 积分: 300 )

  • 主题发起人 主题发起人 web518
  • 开始时间 开始时间
W

web518

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一个程序。在长时间运行以后。会弹出错误对话框。。。我用的是clientsocket组件(D7+winXP)。在clientsocket的read事件事有如下接收代码:
procedure Tmzjdform.clientFFRead(Sender: TObject;
Socket: TCustomWinSocket);
var
re:pchar;
relong:integer;
c1,c2:array[0..70000] of char;
begin
re:=nil;
relong:=0;
c1[0]:=#0;
c2[0]:=#0;
while socket.ReceiveLength>0 do
begin
//申请内存
re:=AllocMem(socket.receivelength);
//c2:=AllocMem(socket.receivelength);
TRY
relong:=socket.ReceiveLength;
if relong>=70000 then exit;
Socket.ReceiveBuf(re^,Socket.receivelength);
//计算数据长度
copymemory(@c1[0],re,relong);
decodea(@c1[0],@c2[0],relong);
if ord(c2[0])=$FF then
begin
ascstrtopchar('FFFF000000000000',@C1[0]);
sendmypack(@c1[0],8);
end;
myrecv(@c2[0],relong);
FINALLY
try
if re<>nil then
freemem(re);
except
mymessage('无效的指针。所以没释放',1);
end;
END;
end;
end;
虽然我做了这些容错处理。但是还是会弹出错误的话框框。内容是:Access violation at address 004635E1 in module 'aa.exe'. Read of address 7F57550B。
如果我把接收的指令动态指针换成静态字符数组的话。
Socket.ReceiveBuf(re^,Socket.receivelength);-->Socket.ReceiveBuf(c1,Socket.receivelength);
那么。弹出这样对话框的机率大大减少。我测试的时候没见过。用户有反应说有。但很少。
不过出现个新的问题就是程序占用内存大大增加,而且长时间运行时会出现程序无响应的问题。(字符数组的定义没有变)
还有一个问题是长时间运行有时候会自动关闭程序。因为接收的数据长度不确定,以前定义为20000时。出现的比较多,所以我定义的是70000。相对少了一点。但这样点用内存就比较多了。因为接收的数据要进行计算,所以在另一个过程里有三个临时数组也得定义成70000。我试了换成动态指针后,就会出错。但不会定位到源代码里。只是弹出错误以及CPU那个对话框。
哪位大哥不忙的话帮小弟解决一下。解决以后小弟会有小小意思一下!
 
我有一个程序。在长时间运行以后。会弹出错误对话框。。。我用的是clientsocket组件(D7+winXP)。在clientsocket的read事件事有如下接收代码:
procedure Tmzjdform.clientFFRead(Sender: TObject;
Socket: TCustomWinSocket);
var
re:pchar;
relong:integer;
c1,c2:array[0..70000] of char;
begin
re:=nil;
relong:=0;
c1[0]:=#0;
c2[0]:=#0;
while socket.ReceiveLength>0 do
begin
//申请内存
re:=AllocMem(socket.receivelength);
//c2:=AllocMem(socket.receivelength);
TRY
relong:=socket.ReceiveLength;
if relong>=70000 then exit;
Socket.ReceiveBuf(re^,Socket.receivelength);
//计算数据长度
copymemory(@c1[0],re,relong);
decodea(@c1[0],@c2[0],relong);
if ord(c2[0])=$FF then
begin
ascstrtopchar('FFFF000000000000',@C1[0]);
sendmypack(@c1[0],8);
end;
myrecv(@c2[0],relong);
FINALLY
try
if re<>nil then
freemem(re);
except
mymessage('无效的指针。所以没释放',1);
end;
END;
end;
end;
虽然我做了这些容错处理。但是还是会弹出错误的话框框。内容是:Access violation at address 004635E1 in module 'aa.exe'. Read of address 7F57550B。
如果我把接收的指令动态指针换成静态字符数组的话。
Socket.ReceiveBuf(re^,Socket.receivelength);-->Socket.ReceiveBuf(c1,Socket.receivelength);
那么。弹出这样对话框的机率大大减少。我测试的时候没见过。用户有反应说有。但很少。
不过出现个新的问题就是程序占用内存大大增加,而且长时间运行时会出现程序无响应的问题。(字符数组的定义没有变)
还有一个问题是长时间运行有时候会自动关闭程序。因为接收的数据长度不确定,以前定义为20000时。出现的比较多,所以我定义的是70000。相对少了一点。但这样点用内存就比较多了。因为接收的数据要进行计算,所以在另一个过程里有三个临时数组也得定义成70000。我试了换成动态指针后,就会出错。但不会定位到源代码里。只是弹出错误以及CPU那个对话框。
哪位大哥不忙的话帮小弟解决一下。解决以后小弟会有小小意思一下!
 
socket.ReceiveLength 这个方法返回的长度基本是不可靠的
数据包的长度应该由你们的协议来约定而不是靠socket.ReceiveLength
 
因为服务端不是我写的~
而且收回的数据包从8以上,都是8的倍数。但肯定不是固定的!
还有什么办法吗?
 
在这段程序中:
relong := Socket.ReceiveLength;
if relong >= 70000 then exit;
Socket.ReceiveBuf(re^, Socket.ReceiveLength);
两个Socket.ReceiveLength 由于时间差可能会有不同,而re在前面已经分配了空间,若不够则可能报错,而c1由于是固定空间,只要第二个Socket.ReceiveLength不超过70000就应当不会出错。你可再测试一下。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
706
import
I
后退
顶部