Terminate: Na ja. Die Methode
Terminate setzt einen Wert der innerhalb des Threads (
Execute) abgefragt werden kann und sollte. Also die Eigenschaft
Terminated. Du musst diese Eigenschaft natürlich überall dort überprüfen wo du gerne abbrechen möchtest. Um den Thread zu beenden musst du nur die Methode Execute verlassen. Aktuell ist es in deinem Code so, dass du am Anfang überprüfst ob der Thread beendet wurde und ansonsten deine Liste mit Dateien kopierst. Wenn du sie kopiert hast, dann sorgst du mittels
Terminate dafür, dass sich dein Thread beenden. Dadurch kennt dein Thread nur zwei Stellen an der er aussteigen kann. Bevor er irgendwas gemacht und nachdem er alles erlegt hast. Wenn du das Kopieren nur ein Mal ausführst geht das auch deutlich einfacher.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure copy.execute; begin try try while not (terminated or eof (InFile)) do begin end; finally end; except end; end; |
Problem an dem Code ist aktuell, dass du nicht direkt weißt ob der Thread jetzt beendet wurde oder ob er die Liste komplett abgearbeitet hat. Alternativ zu solche einer Schleife kannst du auch folgendes machen. Je nachdem wie du das gerne haben willst.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| while not eof (InFile) do begin if Terminated then begin exit; end;
end; |
Was mir gerade noch aufgefallen ist. Damit kannst du später ganz böse auf die Nase fallen. Du setzt
FreeOnTerminate innerhalb des Konstruktors deines Thread und benutzt außerhalb des Threads noch die Instanz des Threads. Dabei muss man sehr sehr genau aufpassen. Wenn die Methode Execute fertig ist wird der Thread automatisch frei gegeben. Wenn du dann noch mal auf die Instanz zugreifst (Anzahl/Liste der nicht kopierten Dateien oder so), dann gibts eine Zugriffsverletzung. Also entweder FreeOnTerminate setzen und den Thread komplett alleine laufen lassen oder FreeOnTerminate nicht setzen und dann den Thread selber per Hand freigeben. Dafür kannst du bei der letzten Methode aber sicher sein, dass deine Instanz dir nicht irgendwann unter den Fingern weggezogen wird.
Und ich kann dummzeuch nur zustimmen. Aus einem Thread solltest du nicht auf ein Fenster oder irgendwelchen Fensterelemente zugreifen. Die VCL ist nicht sicher und du kannst dir schon gut Probleme dabei einfangen. Allerdings hast du sehr sehr viele Statusinformationen. Wenn die alle über Synchronize ausgegeben werden solltest du etwas bedenken. Um so mehr Statusinformationen du ausgeben musst um so häufiger muss der Thread warten. Wenns zu viele werden, dann ist der Thread irgendwann nur noch mit Warten beschäftigt. Damit wird der nutzen von Threads geschmälert bis er gegen null tendieren kann. Das aber nur mal so am Rande. Das wird wahrscheinlich später noch mal interessant werden können.
Nur die Menschheit ist arrogant genug, um zu glauben sie sei die einzige intelligente Lebensform im All. Wo nicht mal das nachhaltig bewiesen wurde.