【发布时间】:2014-07-08 07:30:52
【问题描述】:
我正在将基于 Indy TCP 组件的服务器从 Delphi 7 移植到 XE5 以启用 64 位支持。现在,在我完成所有移植并运行服务器之后,它在测试环境中运行良好。在用户数超过 400 之前它一直运行良好。之后它开始创建访问冲突错误。有时打破错误将我指向 indy 源文件,有时指向 CPU 窗口。我无法在我的源代码中查明产生错误的代码区域。
虽然这种访问冲突错误意味着我正在访问一些尚未实例化的对象,但是为什么当较少的用户在线并且整个代码与Delphi 7代码完全相同时不会产生错误,对象被访问并以与我在 Delphi 7 中相同的方式释放。
我在某处读到,与转换指针相关的东西应该使用 NativeInt 而不是 Integer/Cardinal,现在在我处理传入数据的代码中,代码如下所示
procedure TMyContext.AddToPacketBuffer(Buffer: Pointer; Size: Integer);
var
DestPtr: Pointer;
begin
if PacketBufferPtr + Size<65536 then
begin
DestPtr := Pointer(Cardinal(FPacketBuffer)+Cardinal(PacketBufferPtr));
Move(Buffer^,DestPtr^,Size);
PacketBufferPtr := PacketBufferPtr + Size;
end
else
begin
end;
end;
-
FPacketBuffer 是每个 TMyContext 类中声明的全局指针,PacketBufferPtr是每个 TMyContext 类中声明的 Integer 变量
我应该在这里使用 NativeInt 而不是 Cardinal?这可能是问题的根源吗?如果是,为什么当用户数低于 400 时它不会产生错误,我在本地环境中使用所有功能进行了测试,并且没有单个代码部分产生错误。
谢谢
【问题讨论】:
-
我回滚了您的编辑。你真的需要问一个新问题。这是个好问题。简洁明了。您的编辑提出了一个新问题。随意提出一个新问题。
-
是的,我在提交编辑后意识到:)
标签: delphi delphi-7 delphi-xe5