【发布时间】:2013-11-25 10:04:20
【问题描述】:
我正在尝试制作一个通过 DataSnap 服务器连接到 MySQL 的 Android/Ios 应用程序。 我想把它作为一个线程。当我不使用线程时它工作正常。 在一些文章中提到,在线程中使用 COM 对象时,必须使用 CoInitialize 和 CoUninitialize。 (但我没有让它工作)
这对于 FireMonkey 应用 Android/Ios 是否正确?
我的线程代码:
Constructor TDMThread.Create(CreateSuspended: Boolean; ServerClassName, ProviderName:String; var ds:TclientDataset; n1:String=''; p1:String=''; n2:String=''; p2:String=''; n3:String='';p3:String='';n4:String='';p4:String='');
begin
Inherited Create(CreateSuspended);
FreeOnTerminate := False;
iServerClassName:=ServerClassName;
iProvName := ProviderName;
ip1 := p1;
in1 := n1;
ip2 := p2;
in2 := n2;
ip3 := p3;
in3 := n3;
ip4 := p4;
in4 := n4;
OutDS := ds;
end;
Destructor TDMThread.Destroy;
begin
inherited Destroy;
end;
procedure TDMThread.Execute;
var
par1,par2,par3,par4:Tparam;
begin
SQLConnection1 := TSQLConnection.Create(Nil);
SQLConnection1.DriverName := 'DataSnap';
SQLConnection1.Params.Values['HostName'] := 'localhost';
SQLConnection1.Params.Values['Port'] := '211';
SQLConnection1.Params.Values['DSAuthenticationPassword'] := '******';
SQLConnection1.Params.Values['DSAuthenticationUser'] := '*******';
SQLConnection1.Params.Values['DriverUnit'] := 'Data.DBXDataSnap';
SQLConnection1.Params.Values['CommunicationProtocol'] := 'tcp/ip';
SQLConnection1.Params.Values['DatasnapContext'] := 'datasnap/';
SQLConnection1.Params.Values['DriverAssemblyLoader'] := 'Borland.Data.TDBXClientDriverLoader,Borland.Data.DbxClientDriver,Version=19.0.0.0,Culture=neutral,PublicKeyToken=91d62ebb5b0d1b1b';
DSProviderConnection1:=TDSProviderConnection.Create(NIL);
DSProviderConnection1.SQLConnection := SQLConnection1;
DSProviderConnection1.ServerClassName := iServerClassName;
SQLConnection1.Connected:=True;
ClientDataSet1 := TClientDataSet.Create(Nil);
ClientDataSet1.RemoteServer := DSProviderConnection1;
ClientDataSet1.ProviderName := iProvName;
ClientDataSet1.Close;
ClientDataSet1.Open;
ClientDataset1.FindFirst;
OutDS.CloneCursor(ClientDataSet1,False,True);
// Some more code ...
end;
有人有什么想法吗?有效的例子? 我有 XE5.1 并在 Windows 8.1 上工作。
【问题讨论】:
-
究竟是什么不起作用?
-
CoInitialize是一个初始化 COM 的 Windows API 调用。由于 Android、iOS 和 OSX 不在 Windows 上运行,因此无法使用 Windows COM,CoInitialize不适用于那里。 -
好的。我删除了 Excecute 中的所有代码,除了 SQLConnection1 := TSQLConnection.Create(Nil);应用程序崩溃。可以是我调用线程的方式吗?
标签: mysql multithreading delphi firemonkey datasnap