Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Grundsatzfrage zu Thread und Sequenziell abarbeiten (https://www.delphipraxis.net/191263-grundsatzfrage-zu-thread-und-sequenziell-abarbeiten.html)

Kostas 27. Dez 2016 12:05

Grundsatzfrage zu Thread und Sequenziell abarbeiten
 
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

Delphi-Laie 27. Dez 2016 12:07

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten
 
Zitat:

Zitat von Kostas (Beitrag 1357268)
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.

Mavarik 27. Dez 2016 12:19

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten
 
Zitat:

Zitat von Kostas (Beitrag 1357268)
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

Der schöne Günther 27. Dez 2016 12:28

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten
 
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?

p80286 27. Dez 2016 12:29

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten
 
Zitat:

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

Zitat:

Zitat von Kostas (Beitrag 1357268)
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!

a.def 27. Dez 2016 12:30

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten
 
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

Kostas 27. Dez 2016 13:24

AW: Grundsatzfrage zu Thread und Sequenziell abarbeiten
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:17 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