AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Delphi OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Container?
Thema durchsuchen
Ansicht
Themen-Optionen

OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Container?

Ein Thema von juergen · begonnen am 15. Okt 2017 · letzter Beitrag vom 27. Okt 2017
Antwort Antwort
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai

  Alt 20. Okt 2017, 21:55
Ja.
Schreib mal TThread.Synchronize(nil,...
Nö, immer noch gleiche Fehlermeldung.
Stefan
  Mit Zitat antworten Zitat
HolgerX

Registriert seit: 10. Apr 2006
Ort: Leverkusen
961 Beiträge
 
Delphi 6 Professional
 
#2

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai

  Alt 21. Okt 2017, 00:13
Hmm..

Stell mal (bezogen auf das Beispiel) so um:

Delphi-Quellcode:
procedure Tmp3ReaderThread.Execute;
begin
  Lese_die_Datei_aus(FFileName, FData); // Speicher von FData liegt im Thread!
  
  Synchronize(DoComplete);
end;

procedure Tmp3ReaderThread.DoComplete;
begin
  if Assigned(FOnComplete) then
    FOnComplete(Self, FFileName);
end;
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai

  Alt 21. Okt 2017, 12:16
Jau, so compiled es jetzt!
Danke HolgerX.

Edit: Kleinere Korrekturen wären noch:
1. Der Konstruktor für die ThreadListe ist parameterlos: TL := Tmp3ThreadList.Create;
2. Das Auswählen des Records der DateiListe geht nicht mit Pointer, sondern (vermutlich) mit der Dereferenzierung: if DL.TryGetValue(Filename, Data^) then
Stefan

Geändert von GPRSNerd (21. Okt 2017 um 12:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai

  Alt 23. Okt 2017, 09:47
Wie schon in meiner vorherigen Antwort geschrieben, hatte ich kein Delphi zur Hand und habe den Code "blind" in Notepad++ geschrieben. So wie er in meinem Kopf funktionierte ^^ Dass es da kleinere Unzulänglichkeiten gibt ist ja ganz normal. Da mir konkrete Informationen zur Funktionsweise und Zweck des Programms fehlten, ist mein Beispiel recht generisch konstruiert und kann sicherlich verschlankt werden.

Prinzipiell finde ich Parallelprogrammierung in diesen Zeiten spannender denn je. AMD Ryzen Threadripper kommt mit 16C/32T daher und gefühlt 99,99% aller Delphi-Programme laufen Single-Threaded. Da dauert es nicht mehr lang und die Anwender beschweren sich über lausige Performance trotz Manycore-CPU.

Es gibt ganz tolle Programme, wo einem als Entwickler wirklich das Herz aufgeht wenn man genauer hinschaut und die Threads arbeiten sieht. ACDSee z.B. ist so ein Fall. Die Erzeugung von Thumbnails erfolgt mehrstufig und im Hintergrund. SmartFTP ist noch so ein Beispiel. Hier werden die einzelnen FTP-Loads parallelisiert und können sehr komfortabel im UI über ein SpinEdit auf mehr oder weniger Worker konfiguriert werden. Beides sind m.W. C++ Programme.

IMHO bräuchte es aber noch viel bessere Delphi-MT-Toolkits als bisher verfügbar sind. Denn wie dieses doch wirklich seeeeehr simple Beispiel zeigt, müssen wir immer noch erhebliche Verrenkungen machen um sowas zu parallelisieren.

A) die VCL ist in weiten Teilen immer noch Non-Threadsafe.

B) die RTL ist durch überladene Prozeduren zwar streckenweise Threadsafe, aber eben nicht durchgehend.

C) Die OH wird lästig: In gefühlt jedem zweiten Fall "Embarcadero Technologies verfügt zurzeit über keine zusätzlichen Informationen. Bitte unterstützen Sie uns bei der Dokumentation dieses Themas, indem Sie Ihre Kommentare auf der Diskussionsseite eingeben."

D) FMX wird noch lange Zeit kein Ersatz für die VCL sein, weil es einen großen Teil von Drittanbieter-Komponenten schlichtweg nicht für FMX gibt. Und selbst wenn ist das noch keine Garantie, dass das durchgehend Threadsafe ist.

E) Mir persönlich fehlt es nach wie vor an guten und allgemein verständlichen Büchern und Tutorials zum Thema. Es gibt ein paar schon recht betagte wie dieses hier wo ich nicht mal weiß von wem es ist. Zwar gut erklärt, geht aber nur ganz am Ende und sehr knapp auf die objektorientierte Threadprogrammierung ein.

Mein Fazit: Dringender Handlungsbedarf seitens Embadera.
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter (23. Okt 2017 um 09:57 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von GPRSNerd
GPRSNerd

Registriert seit: 30. Dez 2004
Ort: Ruhrpott
239 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai

  Alt 24. Okt 2017, 12:26
Hallo Codehunter,

no offense intended! Ich bin froh über deinen Beitrag!
Ich versuche nur, deinen Code zum Laufen zu kriegen, was ich auch gerade geschafft habe.

Folgende Verbesserungen habe ich noch eingebaut:

1. Start weiterer Threads in AuslesenFertig() mit der folgenden Kondition, da bereits gestartete Threads mit erneutem T.Start zu einer Exception führen:
Delphi-Quellcode:
if ((T.Suspended) and (not T.Finished) and (not T.Started)) then
begin
  T.Start;
  Break;
end;
2. Freigeben der Threads bereits bei Erzeugung konfigurieren:
T.FreeOnTerminate := True;

3. Freigeben der Pointer auf die Records in den Threads mit Dispose():
Delphi-Quellcode:
New(Daten); // Speicherplatz reservieren
try
  DL.Add(sFile, Daten^);
  T := TDateiReaderThread.Create(True); //Thread ist erstmal suspendiert
  T.FreeOnTerminate := True;
  T.FileName := sFile;
  T.OnComplete := DateiEinlesenFertig;
  TL.Add(T);
finally
  Dispose(Daten);
end;
Stefan
  Mit Zitat antworten Zitat
Benutzerbild von Codehunter
Codehunter

Registriert seit: 3. Jun 2003
Ort: Thüringen
2.272 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai

  Alt 24. Okt 2017, 13:05
no offense intended! Ich bin froh über deinen Beitrag!
Hab ich auch nicht so aufgefasst. Alles ganz entspannt. Mir war klar dass der Code nicht gleich laufen würde.

Ich versuche nur, deinen Code zum Laufen zu kriegen, was ich auch gerade geschafft habe.
Das freut mich.

if ((T.Suspended) and (not T.Finished) and (not T.Started)) then
Das finde ich seltsam. Nicht was du gemacht hast sondern weil T.Suspended und not T.Started nach meinem Verständnis eigentlich niemals beide gleichzeitig TRUE oder gleichzeitig FALSE sein sollten. Die Hilfe zu TThread.Started ist mal wieder außerordentlich hilfreich: "Embarcadero Technologies verfügt zurzeit über keine zusätzlichen Informationen. Bitte unterstützen Sie uns bei der Dokumentation dieses Themas, indem Sie Ihre Kommentare auf der Diskussionsseite eingeben."

Freigeben der Pointer auf die Records in den Threads mit Dispose()
Darauf hatte ich schon gleich im selben Post hingewiesen. Ein bisschen Spaß wollte ich euch ja auch noch übrig lassen... Wobei so wie du das machst, nicht ganz richtig ist. Aber das wirst schon noch merken
Ich mache grundsätzlich keine Screenshots. Schießen auf Bildschirme gibt nämlich hässliche Pixelfehler und schadet der Gesundheit vom Kollegen gegenüber. I und E zu vertauschen hätte den selben negativen Effekt, würde aber eher dem Betriebsklima schaden

Geändert von Codehunter (24. Okt 2017 um 13:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von bytecook
bytecook

Registriert seit: 6. Aug 2010
Ort: Dornbirn
151 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: OmniThreadLibrary: Was ist für meine Anforderung der richtige Weg? Welchen Contai

  Alt 24. Okt 2017, 23:32
Nochmal kurz was zu Omnithread

Omnithread hat für mich einige gewaltige Vorteile mitgebracht, insbesonders die Messageimplementierung, und der Fakt, dass alle Aktualisierungen der Gui mittels Messages im Mainthread erfolgen. Kein ausbremsendes Synchronize mehr, wenn man was visuell aktualisieren möchte.
Es braucht je nach Komplexität der Aufgabe definitiv ein paar Tage oder Wochen an Einarbeitungszeit, um effektiv Nutzen aus dem Library zu ziehen. Critical Sections kann man mit OTL in den meisten Fällen recht elegant umgehen, das spart in zeitintensiven Bereichen einige CS Kernelaufrufe.

Das Buch "Parallel Programming with OmniThreadLibrary" von Primož Gabrijelčič, erhältlich unter

https://leanpub.com/omnithreadlibrary

war und ist extrem hilfreich. Download als PDF, EPUB oder MOBI auf Leanpub verfügbar. (Btw, dort gibt es auch ein nettes Nick Bundle: https://leanpub.com/b/nicksdelphibookbundle/)

Den gesamten Buchinhalt kann man auch online lesen ... http://otl.17slon.com/book/chap00.html
Der für mich wichtigste Teil war der Lowlevel Teil ... http://otl.17slon.com/book/chap05.html#lowlevel
Zum besseren Verständnis des Messagings ... http://www.thedelphigeek.com/2008/07...s-otlcomm.html


Das Schöne bei OTL ist, daß man mit den OTLMessages Objekte, respektive Objektinstanzen in der TOmniValue verschicken kann.
Kommunikation zwischen Threads findet mittels TwoWayComm statt, Beispiele sind im Master von Omnithread immer mit an Bord. Vorsicht, die liegen nicht im \Examples, sondern im \Tests Verzeichnis.

PS: Falls ein Demo mit Tokyo nicht startet, einfach FastMM4 aus dem Demo-Projektquellcode auskommentieren...
Peter
Was mache ich, wenn ein Bär meine Frau angreift?
Nichts. Er hat sie angegriffen, soll er doch selber sehen, wie er sich verteidigt.

Geändert von bytecook (25. Okt 2017 um 08:59 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 06:24 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz