AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Grundsatzfrage zu Thread und Sequenziell abarbeiten
Thema durchsuchen
Ansicht
Themen-Optionen

Grundsatzfrage zu Thread und Sequenziell abarbeiten

Ein Thema von Kostas · begonnen am 27. Dez 2016 · letzter Beitrag vom 27. Dez 2016
Antwort Antwort
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Grundsatzfrage zu Thread und Sequenziell abarbeiten

  Alt 27. Dez 2016, 12:05
Hallo Zusammen,

vorab erwähnt, ich habe kaum Erfahrung mit Threads da ich sie bis jetzt nicht gebraucht habe.

Die Kernfrage: wie können Threads eingesetzt werden wenn der Ablauf zwingend Sequenziell sein muss?

In einer Anwendung wir ein neuer Auftrag angelegt. Direkt danach wird die Auswahl der Kundschaft geöffnet um einen Kunden in den Auftrag zu übernommen. Jetzt kann ich die Artikelauswahl öffnen um einen Artikel in den Auftrag einzulesen. Dabei werden Kundenspezifische Preise ermittelt und in den Auftrag aufgenommen.

Die Sequenz ist also zwingend erforderlich:
1-Neuer Auftrag
2-Kunde auswählen
3-Artikel auswählen
4-Kudenpreis ermittelt(Kunde+Artikel)

In einer Windows Anwendung im LAN ist das auch überhaupt kein Problem. Die selbe Anwendung in einer Adroid App ist sehr wohl ein Problem. Bei Punkt 1 neuer Auftrag anlege geht noch. Bei Punkt 2 kann die Abfrage der Kunden nach den Suchkriterien schon etwas länger dauern. Wenn den Download der Kundenliste länger dauert im Main Thread würde Android die App beenden oder gar das Device neue Starten. Also packe ich den Download in ein Anonymus Thread.

Hier beginnt mein Verständnisproblem.

Eigentlich muss die Anwendung warten bis die Liste der Kunden vollständig geladen ist.
Direkt nach dem Download wir die Liste ausgewertet, bestimmte Kunden werden Fett markiert andere Rot wenn Sie schlecht Zahlen u.s.w. All das passiert nachdem die Kunden abgerufen wurden. Erst danach darf der Anwender den Kunden auswählen zur Übernahme in den Auftrag. Man könnte jetzt die Nachbearbeitung in den gleichen Download Thread packen dann wird wenigstens dieser Teil sequenziell abgearbeitet. Praktisch ist das jedoch nicht. Für Auswertungen wird der gleiche Download der Kunden benötigt jedoch nicht die Nacharbeit. Das könnte man jetzt wieder aufteilen u.s.w.

Wie kann ich z.B.: verhindern dass der Anwender versucht den Artikel auszuwählen währen die Kundenliste noch nicht da ist. Der Download läuft ja in einem anderen Thread und der Main Thread ist wieder frei. Somit kann der Anwender rumhantieren.


Gruß Kostas
  Mit Zitat antworten Zitat
Delphi-Laie

Registriert seit: 25. Nov 2005
1.474 Beiträge
 
Delphi 10.1 Berlin Starter
 
#2

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten

  Alt 27. Dez 2016, 12:07
Die Kernfrage: wie können Threads eingesetzt werden wenn der Ablauf zwingend Sequenziell sein muss?
Entweder gar nicht (weil Threads für die simultane Abarbeitung geeignet sind) oder das Starten des Threads erfolgt erst dann, wenn sein Vorgänger beendet wurde.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

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

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten

  Alt 27. Dez 2016, 12:19
Die Kernfrage: wie können Threads eingesetzt werden wenn der Ablauf zwingend Sequenziell sein muss?
Parallel-Pipeline... (Spoiler - mein Blog)

Im normal Fall will man ja gerade nicht auf etwas warten, aber oft hat man diese Anwendung.

Daher ist ein gutes Beispiel eine Command-Queue... In der Queue stehen commandos und die entsprechenden Pointer auf die Daten und ein Thread arbeitet diese Queue nacheinander ab.

Für den download ist es eher so... 10 Laden für die Anzeige... Dann im Thread mehr laden oder falls der User scolled...

Nur ein paar Anregungen!

Mavarik
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.110 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten

  Alt 27. Dez 2016, 12:28
Zitat:
Erst danach darf der Anwender den Kunden auswählen zur Übernahme in den Auftrag.
Ohne dein Konzept hinterfragen zu wollen (wenn die Datenmenge so groß ist, warum dann z.B. nicht vorher filtern lassen oder seitenweise übertragen) - Wenn der Anwender erst weitermachen darf wenn alles übertragen ist, dann ist das halt so - Bei Windows schaust du auf eine Sanduhr, auf Handy-Apps meistens auf einen Fullscreen-Kreisel und wartest.

Der einzige Unterschied ist hier nur dass Systeme wie Android oder iOS lange nicht so gnädig sind wie Windows und deine Anwendung hart abschießen wenn der Hauptthread nicht mehr reagiert. Also musst du das Suchen in einen Thread oder Task packen, diesen starten und dann eine Sanduhr anzeigen. Die Bedienelemente werden ausgegraut (Enabled = False). Vielleicht noch einen "Abbrechen"-Button.

Wenn der Thread/Task fertig ist, blendest du das "Bitte warten" wieder aus, die Liste wird gefüllt und der Nutzer kann weitermachen.

Oder habe ich mir das jetzt zu einfach vorgestellt?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#5

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten

  Alt 27. Dez 2016, 12:29
Die Sequenz ist also zwingend erforderlich:
1-Neuer Auftrag
2-Kunde auswählen
3-Artikel auswählen
4-Kudenpreis ermittelt(Kunde+Artikel)
Eigentlich muss die Anwendung warten bis die Liste der Kunden vollständig geladen ist.
Direkt nach dem Download wir die Liste ausgewertet, bestimmte Kunden werden Fett markiert andere Rot wenn Sie schlecht Zahlen u.s.w. All das passiert nachdem die Kunden abgerufen wurden. Erst danach darf der Anwender den Kunden auswählen zur Übernahme in den Auftrag.
dann fehlt in der ersten Aufzählung also
0-Kundenliste laden?

Ggf. fehlt auch "Artikelliste laden"?

Und warum die vollständige Kundenliste ?

Du solltest die notwendigen Daten und Abläufe identifizieren und dann daran gehen Abläufe in Deinem Programm zu parallelisieren.

Welche Mittel Du dafür dann einsetzt ist zunächst vollkommen egal.

Gruß
K-H

@schöner Mann
gut geschrieben. Danach sollte klar sein, daß es einen GUI-Thread, und weitere Arbeitsthreads braucht!
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (27. Dez 2016 um 12:32 Uhr)
  Mit Zitat antworten Zitat
a.def
(Gast)

n/a Beiträge
 
#6

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten

  Alt 27. Dez 2016, 12:30
Da ich mich aktuell selbst auch damit beschäftige..
wäre hier TTask nicht relativ gut einsetzbar?

Parallelisierung mit Delphis Parallel Library - Parallele Tasks ausführen
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.058 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten

  Alt 27. Dez 2016, 13:24
Hallo Zusammen,

herzlichen Dank für die rege Teilnahme. Natürlich ist das nur ein Beispiel und das Problem zu verdeutlichen. Der Anwender bekommt Filterkriterien, doch auch die können wenn Sie unsinnig sind Unsinn liefern der lange dauert.

Ich habe ein paar Dokumente gelesen über Threads, und auch es ein OnTerminate gibt womit ich informiert werden dass es weiter gehen kann. Doch das alles ist um ein so viel höherer Aufwand und undurchsichtig das ich mir die Frage stelle, kann das wirklich sein oder übersehe ich da etwas wesentliches. Ich kann nicht abschätzen bei einer Mobilen Anwendung wie lange etwas dauern wird da dazwischen ja noch die unstabile Internetverbindung eine gewaltige Rolle spielt. Also muss ich jede Kleinigkeit die vom Server über das Internet abgerufen wird, in ein Thread packen.

Ist der folgende Denkansatz richtig:
Alle Methoden sind erst einmal ohne Thread damit Sie mehrfach verwendet werden können. Bleiben wir mal beim Download der Kunden und das anschließende bearbeiten der Daten.

Delphi-Quellcode:
  TThread.CreateAnonymousThread(procedure ()
  begin
    //Alles was nicht die VCL benötigt
    //wird hier abgearbeitet.
    //Hier könnte der KundenDownload stehen.

    TThread.Synchronize (TThread.CurrentThread,
      procedure ()
      var ADataSetList: TFDJSONDataSets;
      begin

        //Sobald die VCL benötigt wird, muss der Thread syncronisiert werden
        //Wenn der Vorgang länger dauern würde, was würde Android hier machen?
        //Wieder die App beenden oder das Device reseten oder gilt das nur für den Main Thread?

        ADataSetList := KundenDownload(FilterKriterien);
        if (Assigned(ADataSetList) and
            (TFDJSONDataSetsReader.GetListCount(ADataSetList)>0))
        then KundendatenVerarbeiten(ADataSetList);
      end);
  end).Start;
Hier wird der Download und das Verarbeiten in einem Thread zusammengefasst und kann dabei da es Synchronisiert ist auch auf die VCL zugreifen. Darf jetzt dieser Thread beliebig lange laufen oder gilt das nur für den Bereich im AnonymousThread?

Gruß Kostas
  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 22:16 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