AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Ist die Verwendung von TTask so korrekt?

Ist die Verwendung von TTask so korrekt?

Ein Thema von a.def · begonnen am 1. Jan 2017 · letzter Beitrag vom 2. Jan 2017
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.373 Beiträge
 
Delphi 12 Athens
 
#1

AW: Ist die Verwendung von TTask so korrekt?

  Alt 1. Jan 2017, 23:08
Ist ja irgendwie logisch. Die Schleife macht ja nichts anders als ein Steuerelement im Formular hochzuzählen. Wenn du das jetzt synchronisierst läuft das ganze quasi im Thread des Formulares.
Jupp, Synchronisieren muß man mit der VCL/FMX.
Also Threads lohnen sich nur, wenn der enthaltene Code mehr im Thread macht, als in der GUI.

Man kann jetzt die Anzeige-Zugriffe verringern.
z.B. nur jeden 1000. Schleifendurchlauf in die GUI geben
oder die GUI per Timer/Event triggern, welche sich dann ab und an vom Thread den aktuellen Wert holt.

Die Parallel Computing Library (TTask und Co.) ist seit XE7 enthalten.
http://docwiki.embarcadero.com/RADSt...amming_Library
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Jan 2017 um 23:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Ist die Verwendung von TTask so korrekt?

  Alt 2. Jan 2017, 15:55
Also Threads lohnen sich nur, wenn der enthaltene Code mehr im Thread macht, als in der GUI.
Im "Normalfall" würde ich Dir nicht widersprechen.

Aber es stimmt für die mobilen Plattformen und FMX nicht.

Beispiel:

Delphi-Quellcode:
procedure TForm202.Button1Click(Sender: TObject);
begin
  Sleep(1000);
  Caption := '42';
end;

procedure TForm202.Button2Click(Sender: TObject);
begin
  TTask.Run(Procedure
    begin
      TThread.Queue(NIL,Procedure
        begin
          Sleep(1000);
          Caption := '42';
        end;
    end;
end;
hat nicht das gleiche verhalten!

Besser wäre natürlich:

Delphi-Quellcode:
Uses
  Delphiprofi.FDK.Idleworker;

procedure TForm202.Button3Click(Sender: TObject);
begin
  TIdleworker.Default.Execute(
    Procedure
      begin
        Sleep(1000);
        Caption := '42';
      end,true);
end;

Geändert von Mavarik ( 2. Jan 2017 um 16:42 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.643 Beiträge
 
Delphi 12 Athens
 
#3

AW: Ist die Verwendung von TTask so korrekt?

  Alt 2. Jan 2017, 16:20
Delphi-Quellcode:
procedure TForm202.Button2Click(Sender: TObject);
begin
  TTask.Run(Procedure
    begin
      TThread.Query(NIL,Procedure
        begin
          Sleep(1000);
          Caption := '42';
        end;
    end;
end;
Das ergibt aber überhaupt keinen Sinn. Zunächst ist mir TThread.Query völlig unbekannt. Sollte es sich dabei um TThread.Queue handeln, verlagerst du das Sleep ja wieder in den Hauptthread.

Ich hätte jetzt eher diesen Ansatz gewählt:

Delphi-Quellcode:
procedure TForm202.Button2Click(Sender: TObject);
begin
  TTask.Run(
    Procedure
    begin
      Sleep(1000);
      TThread.Query(NIL,
        Procedure
        begin
          Caption := '42';
        end;
    end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.154 Beiträge
 
Delphi 10.3 Rio
 
#4

AW: Ist die Verwendung von TTask so korrekt?

  Alt 2. Jan 2017, 16:47
Das ergibt aber überhaupt keinen Sinn. Zunächst ist mir TThread.Query völlig unbekannt. Sollte es sich dabei um TThread.Queue handeln, verlagerst du das Sleep ja wieder in den Hauptthread.
Klar, sorry Schreibfehler...

Der Sinn ist ganz einfach.

Bei einem Button Klick oder anderen User-Aktionen, starten diese im UI-Thread einen Timer der die Änderungen auf dem Bildschirm (Mouseover/Buttondown/ButtonUp usw.) anzeigt.

Über den TTask.Run starte ich meine Aktionen verzögert. Der Queue Befehl sorgt dafür, dass ich dem UI_Thread die Ausführung überlasse.

Wie gesagt der bessere Weg hierfür ist der OnIdleEvent!

Ich hätte jetzt eher diesen Ansatz gewählt:

Delphi-Quellcode:
procedure TForm202.Button2Click(Sender: TObject);
begin
  TTask.Run(
    Procedure
    begin
      Sleep(1000);
      TThread.Query(NIL,
        Procedure
        begin
          Caption := '42';
        end;
    end;
end;
Logisch!!

Mavarik
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz