AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Unterschied TTread.Synchronize / TThread.Queue

Ein Thema von Harry Stahl · begonnen am 19. Jul 2015 · letzter Beitrag vom 22. Jul 2015
Antwort Antwort
Benutzerbild von Uwe Raabe
Uwe Raabe
Online

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

AW: Unterschied TTread.Synchronize / TThread.Queue

  Alt 19. Jul 2015, 15:49
Du kannst das in deinem Beispiel sehen, wenn du nach dem TParallel.For einfach noch eine Zeile

  ListBox1.Items.Add('Ende'); einfügst.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Unterschied TTread.Synchronize / TThread.Queue

  Alt 19. Jul 2015, 16:04
Das TParallel.&For() ist wie ein
Delphi-Quellcode:
LTask := Task.Run( ... );
LTask.Wait();
Und dort würde auch ein Synchronize einen Deadlock erzeugen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.560 Beiträge
 
Delphi 12 Athens
 
#3

AW: Unterschied TTread.Synchronize / TThread.Queue

  Alt 19. Jul 2015, 18:30
Das TParallel.&For() ist wie ein
Delphi-Quellcode:
LTask := Task.Run( ... );
LTask.Wait();
Und dort würde auch ein Synchronize einen Deadlock erzeugen.
Aber nur wegen des LTask.Wait.

Du kannst das in deinem Beispiel sehen, wenn du nach dem TParallel.For einfach noch eine Zeile

  ListBox1.Items.Add('Ende'); einfügst.
Das wird dann als erstes in die Liste eingefügt und erst später die Einträge aus dem Parallel.Loop. Daraus kann ich dann folgern, dass ich die ganze Zeit noch im Mainthread war, oder?

Aber grundsätzlich Danke, ich glaube, ich komme der Sache vom Verständnis her näher.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.962 Beiträge
 
Delphi 12 Athens
 
#4

AW: Unterschied TTread.Synchronize / TThread.Queue

  Alt 19. Jul 2015, 20:43
Du kannst das in deinem Beispiel sehen, wenn du nach dem TParallel.For einfach noch eine Zeile

  ListBox1.Items.Add('Ende'); einfügst.
Das wird dann als erstes in die Liste eingefügt und erst später die Einträge aus dem Parallel.Loop. Daraus kann ich dann folgern, dass ich die ganze Zeit noch im Mainthread war, oder?
Wenn du Queue benutzt, werden die Threadinhalte tatsächlich erst hinterher ausgeführt. Das liegt aber nicht daran, dass die Schleifeninhalte hinterher ausgeführt werden, sondern an der Auskoppelung durch Queue.

Das kannst du sehr gut an diesem Beispiel sehen:
Delphi-Quellcode:
  MessageBox(0, 'Vorher', 'Test', 0);
  TParallel.For (1,2, procedure (i:Integer)
  begin
    MessageBox(0, PChar(i.ToString), 'Test', 0);
  end);
  MessageBox(0, 'Nachher', 'Test', 0);
Du wirst sehen, dass die Messagebox "Nachher" erst angezeigt wird, wenn die beiden anderen bestätigt sind. Das kannst du aber ja auch einfach mit einem Haltepunkt sehen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Unterschied TTread.Synchronize / TThread.Queue

  Alt 19. Jul 2015, 22:00
Da in TParallel.&For eben genau dieses Wait gemacht wird, muss/kann man es damit vergleichen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.175 Beiträge
 
Delphi 12 Athens
 
#6

AW: Unterschied TTread.Synchronize / TThread.Queue

  Alt 20. Jul 2015, 19:35
Aber in TParallel laufen doch im besten Fall mehrere Threads parallel ab (hoffentlich).
Und das TaskWait kommt für alle am Ende, oder nicht ?

Wie sollte man das den jetzt aufbauen damit es threadsafe wird, geht das überhaupt ?

Die Strings z.B. in TDictionary o.ä zwischenspeichern, und dann nach der TParallel Schleife in die
Listbox übertragen ?
Oder die gute alte TStringList ?
Dann würden zwar die Berechnungen parallel laufen, aber die Übertragung in die Listbox wieder im Hauptthread.

Dann wäre doch das TParallel in solchen Fällen nicht besonders sinnvoll, nur da wo es keine
Inputs zu Komponenten im Hauptthread geben muss.

Oder gibt es eine Konstellation wie man das auch mit TListBox parallel hinbekommt ?

Rollo
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.962 Beiträge
 
Delphi 12 Athens
 
#7

AW: Unterschied TTread.Synchronize / TThread.Queue

  Alt 20. Jul 2015, 21:04
Dann wäre doch das TParallel in solchen Fällen nicht besonders sinnvoll, nur da wo es keine
Inputs zu Komponenten im Hauptthread geben muss.
TParallel ist nur für die Daten- und Logikteile der Anwendung gedacht, nicht für die GUI, ja. Ehrlich gesagt habe ich es da aber auch nie vermisst, da im Hauptthread ohnehin keine längeren Operationen laufen sollten. Und der Teil, der TParallel benutzt, ist ja per Definition eine solche längere Operation, sonst bräuchte man ja keine Threads.

Es sollte also in dem Fall einfach ein Thread für die ursprüngliche Verarbeitung gestartet werden und schon ist das Problem gelöst.
Sebastian Jänicke
AppCentral
  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 12:08 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