【问题标题】:Delphi XE5 DataSnap ThreadDelphi XE5 DataSnap 线程
【发布时间】: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


【解决方案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

【讨论】:

    【解决方案2】:

    如您所见:

    XE5 Android TBitmap.LoadFromStream fail inside a thread

    它在 XE5 中的错误 - 作者的解决方案(循环睡眠)不是等待线程的有效形式...

    【讨论】:

      【解决方案3】:

      不要使用 localhost 作为主机名。在移动设备上是错误的。您需要在运行服务器的机器的本地网络中使用实际 IP

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-01
        • 2012-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多