Hallo zusammen,
ich suche gerade woran die lange Verzögerung bei TTast.Run( liegen kann,
und habe da ein paar interessante Entdeckungen gemacht.
! Mir geht es hier nicht um TThread-Alternativen, sondern nur darum ob es eine Verzögerung beim erstan TTask-Aufruf gibt, und wenn ja warum.
Die generelle Nutzung von TTask.Run mache ich so wie hier
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
Memo_Log( 'PREPARE via Run' ); // <-- hier ist der Timestamp auf 0
TTask.Run(
procedure
begin
Memo_Log_Async( ' BEGIN via Run' ); // <-- hier ist der Timestamp auf bis zu 6000 ms ??
FTaskRunning := 1; // Run
while FTaskRunning <> 0 do
begin
Sleep(25);
...
end;
Memo_Log_Async( ' END via Run' );
end);
end;
Ich habe eine kleine TestApp angehängt (mit etwas zusätzlichem Test-Code drumrum),
in der App habe ich noch versucht die Alternative mit Create-Start zu Testen, mit ähnlichem Ergebnis:
Nach dem ersten App-Start im Debugger braucht der Aufruf von TTask.Xxx bis zu 6 Sekunden !
Das
könnte eventuell am Aufbau eines ThreadPools liegen, aber auch dafür wäre die Zeit enorm.
Zum Testen der Verzögerung muss die App neu gestartet werden, nur der 1. Start und 1.Aufruf entweder Run oder Create.Start ist verzögert.
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
LTask: ITask;
begin
Memo_Log( 'PREPARE via Create-Start' ); //<-- Hier ist der Timestamp auf 0
LTask := TTask.Create( //<-- Hier gibt es ein Blocking für geraume Zeit
procedure
var
LCnt : Integer;
begin
Memo_Log_Async( ' BEGIN via Create-Start' ); // Hier ist der Timestamp auch bis zu 6000 ms
FTaskRunning := 1; // Run
LCnt := 0;
while FTaskRunning <> 0 do
begin
Sleep(25);
...
end;
Memo_Log_Async( ' END via Create-Start' );
end);
Memo_Log_Async( 'CALL START via Create-Start' );
LTask.Start;
end;
Was ich herausgefunden habe ist:
- TTask.Run() verzögert bis zu 6sec. beim ersten App-Start
- TTask.Run() funktioniert beim zweiten+ TTask Aufruf dann wie erwartet (ein paar ms delay)
- TTask.Create.Start zeigt das gleiche Verhalten beim ersten App-Start
- TTask.Create.Start zeigt zusätzlich ein Blockieren des UI-Threads
- TTask.Create.Start läugt nach dem zweiten Start problemlos
- Es geht hier nur um die Verzögerung DIREKT NACH DEM APP-Start
- Der Fehler scheint nur im Debugger aufzutreten, hoffentlich nicht im Release
- Der Fehler scheint nicht unter Android aufzutreten
Ist das Verhalten unter iOS-Debugger bekannt, kann das jemand nachvollziehen ?
Ich teste im Moment auf einem aktuellen iPHoneX, aber ich denke das Problem ist auch auf anderen Geräten gleich.
Im Anhang ein Testprogramm, und Screenshots
TTask.Run() - lange Verzögerung zw. PREPARE und BEGIN
TTask.Create.Start - Blockieren MainThread
TTask.Create.Start - lange Verzögerung zw. PREPARE und BEGIN
Für eine kleine Hilfestellung oder Kommentierung wäre ich sehr dankbar,
auch wenn es am Ende z.B. gegen TTask und auf TOmniThread hinauslaufen sollte.
Ich habe jetzt leider keine Zeit mehr weitere Tests zu machen, ich möchte den Fall aber gerne mit einem guten Gefühl abschliessen.
Hat noch jemand solche seltsamen Erfahrungen mit dem TTask gemacht ?