-
Forum: Programmieren allgemein
by TigerLilly,
11. Jan 2021
Uwe hat mich auf die Idee eines Wrappers gebracht, in den man diesen Overhead verpacken kann. Dann schaut das Beenden - mit Warten bis der Task fertig abgebrochen ist, so aus:
procedure TvTaskWrapper.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Action := aTaskWrapper.CancelTaskWithWait;
end;
Und das tut nicht viel mehr, als zu schauen, ob der Task fertig ist, wenn nicht...
-
Forum: Programmieren allgemein
by TigerLilly,
8. Jan 2021
Mit einem Timer geht es:
procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
CanClose := true;
if Assigned(fTask) then begin
if fTask.Status = TTaskStatus.Running then
fTask.Cancel;
Timer1.Enabled := true;
-
Forum: Programmieren allgemein
by TigerLilly,
8. Jan 2021
Ha! Und ich hab gedacht, ich bin unfähig. Danke trotzdem!
-
Forum: Programmieren allgemein
by TigerLilly,
8. Jan 2021
Danke dafür. Aber wenn ich den Task starte und das Fenster schließe, gibt es eine Zugriffsverletzung.Übersehe ich was?
Die Zugriffsverletzung sieht man aber nur im Debugger und nur wenn dias Unterbrechen bei Exceptions eingeschalten ist. Zur Laufzeit wird die Exception nicht angezeigt.
Gilt auch für TiGüs Vorschlag mit OnCloseQuery. Wahrscheinlich wird die Excpetion geworfen, wenn das ganze...
-
Forum: Programmieren allgemein
by TigerLilly,
8. Jan 2021
Nochmal. Ich möchte das Fenster schliueßen + allfällige Tasks dabei beenden. Nur dann(!!) habe ich ein Problem. Das "warten" ist ja leicht gesagt - aber wie ist die Frage. Zeig mir was besseres als mein Rumgehample.
-
Forum: Programmieren allgemein
by TigerLilly,
8. Jan 2021
Das erschließt sich mir nicht. TTask kapselt doch nur den Zugriff auf Threads. Die Endlos-Schleife samt Abbruch ist nur zu Testzwecken, ändert an der Aufgabenstellung nichts. In echt beendet der Task natürlich, wenn man ihn lässt.
Warum sollte hier ein Thread tauglicher sein als ein Task?
-
Forum: Programmieren allgemein
by TigerLilly,
8. Jan 2021
Nein, das funktioniert nur, wenn der Task schnell genug beendet. Wenn das länger dauert, wird das Formular geschlossen und der TAsk läuft noch - weil er mit Beenden noch nicht fertig ist.
Daher die Anforderung, zu warten, bis der Thread SICHER beendet ist.
-
Forum: Programmieren allgemein
by TigerLilly,
8. Jan 2021
Nein. Das Synchronize stellt ja eben sicher, dass der Button noch existiert. Wäre bei Thread.Queue anders.
Und ich möchte den Task ja canceln, da hilft wait nicht.
-
Forum: Programmieren allgemein
by TigerLilly,
7. Jan 2021
Doku kenne ich, danke. Aber das hilft ja nicht.
Meine Erkenntnisse bisher:
Task.Cancel + Task.Wait geht nicht, weil das eine Exceptioin wirft. Task.Wait wartet auf das "normale" Ende des Tasks.
Das Problem ist auch nicht der Task, sondern das Synchronize im Task.
Wait + Synchronize im Task blockiert sich auch. Also ich kann auch nicht einfach warten, bis der Task fertig ist.
Und...
-
Forum: Programmieren allgemein
by TigerLilly,
7. Jan 2021
Wenn ich das so mache:
while Button1.Enabled = false do begin
Application.ProcessMessages;
end;
tut das, wie ich will.
-
Forum: Programmieren allgemein
by TigerLilly,
7. Jan 2021
Queue ist deswegen schwierig, weil das Timing dann noch kritischer wird - ev. sind da dann wirklich schon Sachen abgeräumt.
Ich verstehe, dass die while-Schleife, den Thread blockiert. Und deswegen wartet das programm beim Synchronize + hängt? Ah, ok!
Aber eigentlich sollte das Synchronize gar nicht mehr aufgerufen werden, wenn der Task gecancelt ist.
Aber wie warte ich dann auf das Ende...
-
Forum: Programmieren allgemein
by TigerLilly,
7. Jan 2021
Ja, das war auch meine erste Vermutung, aber:
OnDestroy wird doch aufgerufen BEVOR alles abgebaut wird.
Und:
Im OnClose gibt es dasselbe Verhalten.
-
Forum: Programmieren allgemein
by TigerLilly,
7. Jan 2021
Im attachten Beipielprogramm startet ein Buttpon einen Task. Der zweite Button beendet ihn. Soweit so gut.
procedure TForm1.Button1Click(Sender: TObject);
begin
Button1.Enabled := false;
Button1.Text := 'Task running';
fTask := TTask.Run(procedure()
begin