Einzelnen Beitrag anzeigen

Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Execption innerhalb AnonymousThread behandeln

  Alt 29. Sep 2014, 22:55
Hallo Zusammen,

ich versuche gerade die Methode GetGruppen in einem AnonymusThread zu packen.
Dabei stellen sich mir eine Menge Frage. Die Methode GetGruppen ist in einem Adroid Mobile Projekt
und ruft über die Methode DataModule1.ServerMethods1Client.GetGruppen ein Dataset aus einem DataSnap Server
und speichert das Ergebnis in ein lokales JASONDataSets Object. Das dürfte im Thread noch keine Probleme machen
das keine Aktionen Objkte auf dem MainThread tangieren.
Die Methode UpdateGruppenNames jedoch packt das JASONDataSets in einer FDMemTable die auf der MainForm liegt.
Mir ist bekannt dass nur der MainThread auf Objekte der Form zugreifen darf. Ist jetzt eine FDMemTable
ebenfalls davon betroffen oder nur Objekte die etwas anzeigen wie z.B.: TLabel, TListView u.s.w.?


Die nächste Frage, was ist mit der Exception innerhalb des Threads, darf ich die ShowMessageFmt werfen
oder muss das in einem TThread.Synchronize erfolgen?


Ohne Thread
Delphi-Quellcode:
procedure TfrMobileMain.GetGruppen;
var
  LDataSetList: TFDJSONDataSets;
begin
  try
    //vom DataSnap Server ein DataSet abrufen
    LDataSetList := DataModule1.ServerMethods1Client.GetGruppen;

    //das DataSet in die MemTable packen
    UpdateGruppenNames(LDataSetList);
  except
    on E: TDSRestProtocolException do
      HandleRestException(DataModule1.DSRestConnection1, 'Get Gruppen error', E);
    on E: Exception do
      ShowMessageFmt('Fehler: %s',[E.Message]);
    else
      raise;
  end;
end;

Mit Thread
Delphi-Quellcode:
procedure TfrMobileMain.GetGruppenThreaded;
begin
  TThread.CreateAnonymousThread(procedure ()
  var
    LDataSetList: TFDJSONDataSets;
  begin
    try

      LDataSetList := DataModule1.ServerMethods1Client.GetGruppen;
      UpdateGruppenNames(LDataSetList);

// TThread.Synchronize (TThread.CurrentThread,
// procedure ()
// begin
// end);


    except
      on E: TDSRestProtocolException do
        HandleRestException(DataModule1.DSRestConnection1, 'Get Gruppen error', E);
      on E: Exception do
        ShowMessageFmt('Fehler: %s',[E.Message]);
      else
        raise;
    end;

  end).Start;{TThread}

end;
Gruß Kostas
  Mit Zitat antworten Zitat