Einzelnen Beitrag anzeigen

Rollo62

Registriert seit: 15. Mär 2007
3.926 Beiträge
 
Delphi 12 Athens
 
#1

TTask.Run( hat im Debugger lange Startverzögerung

  Alt 15. Jul 2019, 18:09
Delphi-Version: 10.2 Tokyo
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
img_0038_1st_2nd.jpg

TTask.Create.Start - Blockieren MainThread
img_0039_blocking.jpg

TTask.Create.Start - lange Verzögerung zw. PREPARE und BEGIN
img_0043_1st_2nd.jpg

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 ?
Angehängte Dateien
Dateityp: zip T284_ThreadDelay.zip (256,4 KB, 0x aufgerufen)
  Mit Zitat antworten Zitat