【发布时间】:2013-10-22 05:59:37
【问题描述】:
我有一个 Delphi XE5 Android 应用程序,它连接到在 PC 上运行的 Indy FTP 服务器(服务器是 Indy 10 IdFTPServer 演示)。 我通过 FTP 从服务器获取相同的文件(每 2 秒)并在我的 Android 设备上的标签中显示内容(24 个字符)。它总是工作 16 次,然后 android 应用程序退出。 从服务器的角度来看,它报告“10054, Connection reset by peer”
代码如下:
procedure TForm3.FetchTimerTimer(Sender: TObject);
var
str : string;
begin
inc(FetchCnt);
aStream.Position := 0;
FTP.Get('Time1.txt', aStream);
aStream.Position := 0;
str := aStream.ReadString(255);
CmdLabel.text := inttostr(FetchCnt) + ') ' + str;
end;
16 是一个神奇的数字吗?在第 16 次 FTP.Get 之前按预期工作 想法?
【问题讨论】:
-
经过进一步调查,Android 应用似乎在 17 日 FTP.Get 后出现分段错误。我可以删除除 FTP.Get 之外的所有内容,但它仍然失败。如果我注释掉 FTP.Get,并将 str 分配给'dummy',它会运行(永远)。任何人都需要想法????
-
分段错误就像 Windows 上的访问冲突。但是如果不知道是哪个代码提高了 SF,就很难诊断。由于 TIdFTP 能够毫无问题地工作 16 次,而且每次都是同一个文件,这让我觉得可能是某些内存已损坏或导致崩溃。当错误发生时你能得到堆栈跟踪吗?如果你下载其他文件,它仍然会崩溃吗?
-
@RemyLebeau 空项目(完全没有代码),只有 IdFTP 组件拖放到表单上并在 4.3(HTC One)上运行,在应用程序退出时应用程序退出,并且在引发 android 错误之后“很遗憾,Project1 已经关闭。”这是一个已知的 IdFTP 错误,即使在 XE5 更新 2 中...?调试器在 IdStack.pas 中的 IdStack.DecUsage 处引发分段错误,如果我理解正确,这就是 Indy 关闭过程...?
-
@JustMarc:不,这不是已知的错误。
TIdStack.IncUsage()在任何 Indy 组件被实例化时调用,然后在组件被释放时调用TIdStack.DecUsage()。这些方法维护对 Indy 的GIdStack全局单例的活动引用,它提供了所有低级套接字 API 访问。如果DecUsage()崩溃,这可能表明未正确管理单例的引用计数,因此可能正在对死对象调用DecUsage()。 -
@JustMarc:这让我觉得
TComponent.FreeNotification()系统在 ARC 下被破坏了。TComponent维护对其拥有的组件的活动引用。调用FTP.Free()只是减少对象的引用计数,它实际上并没有释放对象,因为所有者仍然拥有对它的引用。所以实际的免费仍然会延迟到所有者(表单)在应用退出时被释放。如果要立即释放对象,请改用FTP.DisposeOf()。不过,我不排除GIdStack对象仍然存在 ARC/计时问题的可能性。
标签: android delphi ftp indy delphi-xe5