mysql - Delphi XE5 DataSnap 线程

标签 mysql multithreading delphi firemonkey datasnap

我正在尝试制作一个通过 DataSnap 服务器连接到 MySQL 的 Android/Ios 应用程序。 我想把它作为一个线程。当我不使用线程时它工作得很好。 在一些文章中提到,在线程中使用 COM 对象时,使用 CoInitialize 和 CoUninitialize 很重要。 (但我无法让它发挥作用)

这对于 Android/Ios FireMonkey 应用程序是否正确?

我的线程代码:

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 上工作。

最佳答案

更新信息...

现在正在运行。

我最后做了这个改变:

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);

  // This is new 
  while not terminated do
  Begin
    Sleep(100);
  end;
  // 
  // Some more code ...
end;

我在这里找到了解决方案:XE5 Android TBitmap.LoadFromStream fail inside a thread

关于mysql - Delphi XE5 DataSnap 线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20189271/

相关文章:

php - 使用纬度和经度获取最近的位置

c - 如何知道现有 Openmp 线程的数量

python - 如何在Python中同一对象的另一个线程中生成一个线程?

windows - 如何使用 Delphi 让 Toast 通知保留在 Windows 10 操作中心

delphi - Delphi 的哪些程序分析工具支持持续集成系统?

mysql - 有人可以向我解释一下这个基数参与约束吗?

mysql - 向 MySQL Inner Join 添加多个条件

PHP for 循环不显示正确的数据

python - 尝试为 python 中的并行 API 调用添加节流控制

delphi - 评估 Delphi 中的当前小时