Einzelnen Beitrag anzeigen

fisipjm

Registriert seit: 28. Okt 2013
251 Beiträge
 
#4

AW: TTask.run und Form.close wie geht das richtig?

  Alt 27. Okt 2021, 15:48
Delphi-Quellcode:
TThread.Synchronize(nil,procedure
begin
  if not (hier prüfen, ob die Form noch vorhanden ist) then
    Exit;
  StringGridBindSourceDB1.Visible := true;
Natürlich nicht auf Self oder irgendwas von der Form zugreifen.

Self kann man maximal verwenden, um z.B. in Screen.Forms zu suchen und dort ausschließlich den Zeiger vergleichen.
Gleichzeitig hoffen, dass es keine neue Form gibt, welche inzwischen an der alten Stelle ihren Speicherplatz fand.

Und nicht auf die Idee kommen vor dem Synchronize zu prüfen, weil während diesem Aufruf kann die Form immernoch verschwinden.




Aber, da du garantiert in LaaaaaangsameRESTAbfrageMachen auf Dinge in der Form zugreifst, bleibt nur noch OnCanClose der Form zu nutzen und wenn der Thread noch läuft, dann das Schließen abberechen.
Achtung: Free/Destroy im Code aufgerufen ignoriert OnClose und OnCloseQuery.

Und natürlich hast du da auch aufgepasst, dass im LaaaaaangsameRESTAbfrageMachen alles thread-save ist.
Okay, jetzt bin ich maximal verwirrt

Wenn ich nicht self verwenden kann (klingt logisch), was nutze ich dann?

LaaaaaangsameRESTAbfrageMachen holt sich über eine TBackendEndpoint komponente einen Stream und schiebt ihn eine FDMemtable. Was könnte da denn nicht Threadsafe sein?

Dein letzter Vorschlag hört sich nicht wirklich gut für mich an, das würde ja bedeuten der Bediener kann die Maske nicht schließen so lange der Thread noch läuft, sprich die Daten noch nicht geladen sind. Das würde ich gern vermeiden.
  Mit Zitat antworten Zitat