Delphi XE5 Android线程导致应用程序崩溃
我有一个线程从远程Datasnap服务器下载并保存clientDataset文件cds文件 这个线程可以在Windows、IOS(模拟器、Iphone、Ipad)上运行,但不能在Android上运行 该应用程序在完成文件下载并保存到Android上后崩溃 代码很简单 线程:Delphi XE5 Android线程导致应用程序崩溃,android,multithreading,delphi,delphi-xe5,Android,Multithreading,Delphi,Delphi Xe5,我有一个线程从远程Datasnap服务器下载并保存clientDataset文件cds文件 这个线程可以在Windows、IOS(模拟器、Iphone、Ipad)上运行,但不能在Android上运行 该应用程序在完成文件下载并保存到Android上后崩溃 代码很简单 线程: TDownloadSaveRemoteDBThread = class (TThread) public Username,Password,host,port : String; error
TDownloadSaveRemoteDBThread = class (TThread)
public
Username,Password,host,port : String;
error : String;
Folder : String;
ServerMethod : String;
filename : String;
protected
procedure Execute; override;
end;
procedure TDownloadSaveRemoteDBThread.Execute;
var
sqlCon : TSqlConnection;
cds : TClientDataset;
ssm : TSqlServerMethod;
dpr : TDataSetProvider;
begin
inherited;
error :='';
SqlCon:=TSQLConnection.Create(nil);
try
sqlCon.DriverName:='Datasnap';
sqlCon.LoginPrompt:=false;
sqlCon.Params.Values['hostname']:=host;
sqlCon.Params.Values['port']:=port;
sqlCon.Params.Values['UserName']:=Username;
sqlCon.Params.Values['Password']:=Password;
try
sqlCon.Open;
cds:=TClientDataset.Create(nil);
ssm:=TSqlServerMethod.Create(nil);
dpr:=TDataSetProvider.Create(nil);
try
ssm.SQLConnection:=SqlCon;
ssm.ServerMethodName:=ServerMethod;
dpr.DataSet:=ssm;
cds.SetProvider(dpr);
cds.Open;
cds.SaveToFile(folder+filename);
cds.Close;
finally
cds.free;
ssm.free;
dpr.free;
end;
Except
on E : Exception do
Begin
error:=E.Message;
SQLCon.Close;
End;
end;
finally
SQLCon.Close;
SQLCon.free;
end;
end;
在我的主窗体“开始窗体”中有一个启动线程的按钮
procedure TStartForm.Button1Click(Sender: TObject);
var
DownloadSaveRemoteDBThread : TDownloadSaveRemoteDBThread;
begin
DownloadSaveRemoteDBThread:= TDownloadSaveRemoteDBThread.Create(true);
DownloadSaveRemoteDBThread.OnTerminate:= StartForm.ferdigHentDB;
DownloadSaveRemoteDBThread.Password:='test';
DownloadSaveRemoteDBThread.Username:='test';
DownloadSaveRemoteDBThread.host:=edit1.text; //127.0.0.1
DownloadSaveRemoteDBThread.port:='211';
DownloadSaveRemoteDBThread.Folder:=System.IOUtils.TPath.GetDocumentsPath + PathDelim +'db'+ PathDelim;
DownloadSaveRemoteDBThread.ServerMethod:= 'TServerMethods2.hentselect3';
DownloadSaveRemoteDBThread.filename:='select3.cds';
DownloadSaveRemoteDBThread.FreeOnTerminate:=true;
DownloadSaveRemoteDBThread.Start;
end;
然后线程完成后,我有这个简单的过程
procedure TStartForm.ferdigHentDB(sender: Tobject);
begin
with sender as TDownloadSaveRemoteDBThread do
Begin
if error > '' then
Begin
showmessage(error);
End;
End;
end;
关于Android崩溃的原因有什么建议吗?这个问题有没有简单的解决方法?XE5中的TThread在Android上有两个主要错误
Sychronize()
和Queue()
被破坏(Synchronize()
用于触发OnTerminate
事件),并且如果线程使用任何JNI对象,则TThread
在终止之前不会从Android JVM中分离。尚未修复。第二个bug在XE6中已修复,但在XE5中有一个可以使用的bug。如果android版本支持多线程连接,您是否查阅了数据库驱动程序的文档?谢谢,但我可以找到如何实现修复的方法。过程MyEndThreadProc(ExitCode:Integer)
在我的system.classes中,我发现这个代码`{$ELSEIF Defined(POSIX)}如果赋值(EndThreadProc),那么EndThreadProc(Result);pthread_退出(结果);{$ENDIF POSIX}`有没有人举个例子说明如何在system.classes中分配MyEndThreadProc我发布的链接中有什么不清楚的地方?它准确地告诉您如何实施修复EndThreadProc
是一个函数指针。只需将提供的函数复制到代码中,然后在应用程序启动时将其地址分配给System.Classes.EndThreadProc
变量即可<每当基于TThread
的线程终止时,code>TThread将调用您的函数。