AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

"Grundsatzfrage" zur Thread-Programmierung

Ein Thema von Errraddicator · begonnen am 18. Sep 2008 · letzter Beitrag vom 23. Sep 2008
Antwort Antwort
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#1

"Grundsatzfrage" zur Thread-Programmierung

  Alt 18. Sep 2008, 15:28
Hiho,

hab da mal ne grundlegende Frage, die ich eigentlich nich im Detail sondern eher grob beantwortet haben möchte, da ich damit erst demnächst anfangen kann, wollte mich nur im Vorfeld schon ma etwas schlau machen, worauf ich so zu achten hab.

Bisher laufen meine Programm meist nach folgendem Schema ab:
- Form wird gestartet
- Benutzer tätigt Eingaben
- Benutzer startet per Button die Verarbeitung bestehend aus Prozeduren und/oder Funktionen innerhalb des Formulars geschieht
- Benutzer schließt das Programm

Also ne stinknormale Windows-Anwendung im klassischen Sinne halt.

...

Jetzt habe ich vor folgendes zu machen:
- Form wird gestartet
- Benutzer tätigt Eingaben
- Benutzer startet per die Verarbeitung bestehend aus 3 Threads.
1 Thread zum Lesen der Daten aus der Datenbank und wandeln in Datenstrukturen
1 Thread zum verarbeiten der Datenstrukturen
1 Thread zum schreiben der verarbeiteten Daten in eine Ausgabedatei
- Benutzer schließt das Programm

Sprich: Ich möchte die Verarbeitung von 1 auf 3 Threads aufteilen, um die CPU-Nutzung zu erhöhen und die Laufzeit zu verbessern.

...

Meine Frage bezieht sich jetzt auf die Interaktion zwischen den Freds
Ich habe mir das in etwa so vorgestellt:
Thread 1: Liest Daten aus Datenbank, wandelt und gruppiert diese in brauchbare Datenstrukturen
und stellt jede Datenstruktur sobald sie fertig ist in eine TList z.B.

Thread 2: Überprüft diese TList stetig auf bereit gestellte Daten,
verarbeitet den Datensatz und stellt diesen in eine zweite TList.

Thread 3: Überprüft die zweite TList auf bereit gestellte Daten,
und gibt die Datensätze aus.

...

Schematisch dargestellt
Thread1 (Liest Daten...)
|
v
TList 1
^
|
Thread 2 (Verarbeitet Daten...)
|
v
TList 2
^
|
Thread 3 (Gibt Daten aus...)

...

Ist das so machbar oder gibt es dann Probleme mit dem gleichzeitigen Zugriff auf die TListen z.B.?
Bzw. wer hat sowas schon gemacht / macht sowas und könnte mir sagen worauf man da als mehr oder weniger Threadunerfahrener Mensch achten muss?


Danke im Voraus

cu Patrick
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

Re: "Grundsatzfrage" zur Thread-Programmierung

  Alt 18. Sep 2008, 16:16
Ist so machbar, du musst nur darauf achten, dass nicht gleichzeitig lesen und schreibend auf die Liste zugegriffen wird.
Michael
  Mit Zitat antworten Zitat
MrKnogge

Registriert seit: 9. Jun 2003
Ort: Pforzheim
2.458 Beiträge
 
Delphi 2007 Professional
 
#3

Re: "Grundsatzfrage" zur Thread-Programmierung

  Alt 18. Sep 2008, 16:21
Zitat von Luckie:
[...] nicht gleichzeitig lesen und schreibend auf die Liste zugegriffen wird.
Wäre es daher nicht besser lesen/schreiben in einen Thread zu packen?
Christian Bootz
Einstein ist tot, Newton ist tot,
und mir ist auch schon ganz schlecht...
  Mit Zitat antworten Zitat
Benutzerbild von jfheins
jfheins

Registriert seit: 10. Jun 2004
Ort: Garching (TUM)
4.579 Beiträge
 
#4

Re: "Grundsatzfrage" zur Thread-Programmierung

  Alt 18. Sep 2008, 20:25
Sollte so gehen, aber ich würde das noch etwas verändern.

Um das ganze besser zu trennen und zu vereinfachen, würde ich folgende Striktur vorschlagen:

1. Die ganze Arbeit ist in einer Klasse gekapselt.
Beispielsweise mit 3 Methoden Lesen(), Verarbeiten() und schreiben()

Am Anfang alle 3 Thread erstellen mit Suspended = true; und 4 Objektlists erstellen.

MainThread erstellt 1 Objekt mit den Anfangsdaten. Tut das dann in eine Liste rein und wirft den ersaten Thread an. Der schaut dann in diese Lste rein und nimmt das Objekt da raus (sysnchronisiert). (So kann vom Hauptthread auch nicht mehr darauf zugegriffen werden)
Thread 1 ruft jetzt Objekt.Lesen() auf - welches daraufhin ja im Thread abläuft. Danach kann das Objekt (synchronisiert) in der zweiten Liste abgelegt werden und Thread 2 angeworfen werden.
Jetzt schaut der Thread 1 wieder nach Daten, wenn keine mehr da sind, legt er sich schlafen, sonst fängt er von vorne an.
Währenddessen fängt Thread 2 an, zu arbeiten, und entfernt das Objet aus Liste 2, rift Objekt.Verarbeiten() auf und so weiter

Am Ende landen die Verarbeiteten Objekte dann (von Thread 3) in Liste 4 und du kannst damit wieder machen, was du willst.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#5

Re: "Grundsatzfrage" zur Thread-Programmierung

  Alt 19. Sep 2008, 17:38
Zitat von Errraddicator:
Sprich: Ich möchte die Verarbeitung von 1 auf 3 Threads aufteilen, um die CPU-Nutzung zu erhöhen und die Laufzeit zu verbessern.
Die CPU-Nutzung zu erhöhen kann nur ein Mittel sein um die Laufzeit zu verringern. Es stellt sich nur die Frage ob das in diesem Fall der richtige Weg ist.
Ich habe die Erfahrung gemacht das oft schon kleine Eingriffe in den Ablauf eine dramatische Veränderung der Laufzeit bringen.
Da Threads das Programm deutlich verkomplizieren können, sind sie für diesen Zweck eher das letzte Mittel.

Unabhängig davon halte ich es für sinnvoller wenn ein Thread die Verantwortung für jeweils ein Datenobjekt übernimmt. Das heist er führt für dieses Datenobjekt nacheinander alle Aufgaben vom Lesen über Verarbeiten bis zur Ausgabe durch. Sind die Aufgaben für ein DatenObjekt erledigt, so kann man diesem Thread ein neues DatenObjekt übergeben oder beenden. Entsprechend den verfügbaren Ressourcen kann das Programm zur Laufzeit die Anzahl der Threads steuern.
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#6

Re: "Grundsatzfrage" zur Thread-Programmierung

  Alt 22. Sep 2008, 09:18
Zitat von Blup:
Die CPU-Nutzung zu erhöhen kann nur ein Mittel sein um die Laufzeit zu verringern. Es stellt sich nur die Frage ob das in diesem Fall der richtige Weg ist.
Ich habe die Erfahrung gemacht das oft schon kleine Eingriffe in den Ablauf eine dramatische Veränderung der Laufzeit bringen.
Das Problem sind bei meinen Anwendungen hauptsächlich die Datenbankzugriffe.
Und da ich im Regelfall auf eine objektorientierte und keine relationelle Datenbank zugreife (über eine mitgelieferte Schnittstelle des Software-Herstellers) sehe ich da auch ehrlich gesagt keine großartige Möglichkeit, das zu beschleunigen.
Denn wenn der Datenzugriff dort nun ma so und so lange dauert, bis ich was auslesen kann, dann dauert das halt so lange.

Von daher muss ich ja drumherum arbeiten / meine Programme so gestalten, dass ich diesen Flaschenhals so weit wie möglich umgehe, denn den Flaschenhals an sich kann ich ja nich beeinflussen.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.464 Beiträge
 
Delphi 12 Athens
 
#7

Re: "Grundsatzfrage" zur Thread-Programmierung

  Alt 22. Sep 2008, 17:18
In dem Fall bringt die Aufteilung auf mehrere Threads vermutlich keine Verbesserung der Gesamtlaufzeit (es sei den die Schnittstelle ist Multithreadfähig).
Ich würde neben dem Hauptthread, der mit dem Benutzer interagiert, nur einen zweiten Thread anlegen, der im Hintergrund die Arbeit erledigt.
  Mit Zitat antworten Zitat
Errraddicator

Registriert seit: 26. Jun 2008
161 Beiträge
 
Delphi 2007 Professional
 
#8

Re: "Grundsatzfrage" zur Thread-Programmierung

  Alt 23. Sep 2008, 08:06
Ist natürlich gut möglich, dass das keine relevanten Vorteile bringen wird, aber zumindest versucht will ich es mal haben.
  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 16:35 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