Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: Form reagiert nicht während idftp1.get trotz application.processmessages

  Alt 13. Jul 2014, 15:20
Generell empfiehlt es sich bei der Programmierung immer zu überlegen, wie das im realen Leben funktionieren würde.

Statt eine Datei per FTP zu laden stellen wir uns vor, wir wollen etwas besorgt haben. Eine Gurke (Datei) aus dem Supermarkt (FTP-Server). Da wir selber (GUI) gerade am telefonieren sind (Interaktion mit dem User) und den Teilnehmer nicht mit Geräuschlosigkeit verunsichern wollen (Anwendung reagiert nicht) schicken wir jemand Anderen (Thread) los.

Dieser Andere (Thread) braucht nun bevor er losgeht alle notwendigen Informationen um die Aufgabe zu erledigen:
  • Was soll besorgt werden? Eine Gurke (Datei foo.txt)
  • Wo soll das besorgt werden? Supermarkt gleich um die Ecke (ftp.foo.com)
  • Womit soll er kaufen? Mit Geld (Benutzername, Kennwort)
Diese Informationen schreibe ich ihm auf einen Zettel und gebe ihm den Zettel mit (man beachte, dass dieser Zettel nun ausserhalb des eigenen Zugriffs ist).

Irgendwann kommt derjenige dann wieder und hat, wenn nichts schief gelaufen ist, die Gurke (Datei) dabei.

Ab jetzt kann ich auf die Gurke (Datei) zugreifen.

Läuft etwas schief, dann kann ich auf die Gurke (Datei) natürlich nicht zugreifen:
  • Geld hat nicht ausgereicht (Zugangsdaten falsch)
  • Gurken waren aus (Datei nicht gefunden)
  • Der Supermarkt ist zur Zeit geschlossen (Server nicht gefunden)
  • ...

Weitere Betrachtungen:

Wenn ich über den aktuellen Zustand informiert werden möchte, dann muss der Andere (Thread) mich eben fortlaufend anrufen und mich informieren. Da ich aber am telefonieren und nicht unhöflich bin, nehme ich diesen Anruf nicht mitten im Satz an, sondern entschuldige mich kurz, nehme den Anruf und damit die Information an, und lege wieder auf (Synchronize).

Wenn ich schon sehr modern bin, dann lasse ich mir einfach eine SMS schicken und schaue mir wenn ich Zeit habe die Information an (Queue).

Meinen Gegenüber kann ich dann immer wieder über den Fortschritt unterrichten (Progressbar aktualisieren).

Abbruch des Auftrags:

Um den Auftrag abzubrechen, schicke ich dem Anderen (Thread) eine SMS (Event), dass ich die Gurke (Datei) nicht mehr benötige.
  • Ist er noch auf dem Weg dorthin, kehrt er einfach wieder zurück (vor der FTP-Verbindung)
  • Ist er schon im Supermarkt (Verbindung zum FTP-Server hergestellt, Datei wird geladen), dann einfach alles wieder weglegen und zurückkehren (Verbindung trennen und die bis jetzt geladenen Daten verwerfen)
  • Hat er die Gurke schon gekauft, dann die Gurke wegwerfen (Datei wieder löschen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat