簡體   English   中英

Delphi XE5 DataSnap線程

[英]Delphi XE5 DataSnap Thread

我正在嘗試制作一個通過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上工作。

更新資料...

現在正在運行。

我在最后做了此更改:

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在線程內失敗

如您所見:

XE5 Android TBitmap.LoadFromStream在線程內失敗

它在XE5中的錯誤-作者的解決方案(循環睡眠)不是等待線程的有效形式...

不要使用localhost作為主機名。 在移動設備上,這是錯誤的。 您需要在運行服務器的計算機的本地網絡中使用實際IP

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM