Hallo,
Zitat von
Susanne:
In myThread.Execute packe ich dann die Funktion, die die ganze Abarbeitung der Blöcke steuert. Ist das richtig?
Korrekt. Der neue Thread wird dann parallel zum Rest deines Dientes/Programmes ausgeführt.
Zitat von
Susanne:
und in die
Unit des Dienstes in der Methode onStart kommt dann dieses rein, und dadurch wird der Thread dann gestartet?
myThread := TWorkerThread.Create(false);
Ja, der Parameter false gibt an das er sofort loslaufen soll. Das steht auch in der Hilfe zu
TThread. Außerdem kannst du dort noch solche Sachen machen wie Priorität des Threads festlegen (Eigenschaft
TThread.Priority), damit er den Rechner nicht so auslastet.
Zitat von
Susanne:
Ich habe auch noch zwei Timer in der BlockVerarbeitung mit drin, muss ich da noch was besonderes beachten?
...
Wieso hast du denn da noch ein Form drinne? Es ist ein Dienst und die haben so etwas eigentlich nicht! Hast du da irgend etwas anderes wichtiges drauf außer die Timer?
Zitat von
Susanne:
solange der Thread also nicht beendet wurde läuft er immer wieder durch die Schleife, wenn ich nun den Dienst beende sage ich dem Thread durch den Assigned-Teil, dass er beendet werden soll und er geht aus der Schleife raus? und ruft dann FormCloseQuery aus?
Nicht ganz, das Assigned ist nur dazu da um zu schauen ob der Thread auch schon gestarten oder nicht schon beendet wurde. Das myThread.Terminate sorgt dafür das im Thread u.a. das Terminated wahr wird. Durch das myThread.WaitFor wartet die onStop Methode bis der Thread auch wirklich fertig ist und das FreeAndNil gibt dann einfach den Thread frei.
Zitat von
Susanne:
Frage: FormCreate läuft eigentlich auch in einer endlos-Schleife, Füher hat er das Signal zum sich beenden durch das Klicken auf das Kreuz des Fensters bekommen. Und das FormCreate lief auch nicht in einer Schleife.
Wie gesagt - Dienste haben keine Formulare! Wenn der Benutzer etwas rumklicken können muß (außer zum Beenden) ist ein Dienst dafür vielleicht nicht geeignet.