Autor Beitrag
DennisHB
Hält's aus hier
Beiträge: 5

Win XP
D6
BeitragVerfasst: Do 21.05.09 01:15 
Tach Ihr Lieben,

ich bastel schon ne Weile in Delphi rum (D6), was halt auch dazu führt, das meine Projecte immer komplexer werden...

was ich mich nun Frage - gibt es sowas wie eine Faust-Regel, wann man für etwas einen Thread verwendet, oder geht das immer nach Gefühl?

Warum ich auf diese frage komme:
ich sitze gerade an einem Projekt für meine Movie Sammlung (700+ Einträge [nein nicht alles Filme - Serien machen nen Großteil aus, bei 2+ Staffeln pro Serie hat man die 700 schnell])

das Programm dient als "Media Bibliothek", aus der ich (ins Programm eingebunden) den MoviePlayerClassic starte (fragt nicht nach dem warum... kurz ich mag alles mir bekannte nicht)

nun zum Programm Ablauf:
laden der Movies... als Thread? sprich: Config laden + Folder "scannen" - Thread ja/nein
laden der Details pro Movie... wieder Thread Ja / Nein (hier werden auch Bilder/Cover/Schauspieler/ect... geladen), da geht es im Grunde nur um die fehlenden Details,
nun kommen ggf noch MovieDb-Detail nach laden dazu. (Teilweise werden hier auch LiveStreams gescannt und der "PlayList" hinzugefügt)

Threads an einigen Stellen würden mir sicher erlauben, bereits zu navigieren + Movies zu starten - während Bilder + Details noch aus den Netz/der DB geladen werden.

um es kurz zu machen, mir dauert der Programm-Start zu lange - ich hab zwar, dank einigen Tutorials hier, einen netten Loading-Screen (inkl Shaded-Png), aber ...
besonders die Netz-Anfragen + Image-load dauern recht lange & sind nicht zwingend nötig um einen Clip zu starten. (Netz = Local + Inet, da 3 Rechner auf einen Server/bzw wenn unbekannt Inet zu greifen)

wie gesagt, ich suche hier eher nach einer Faust Regel - ich möchte nicht unbedingt eine Antwort, wie: "Config - Laden im Programm-Thread - die Details und Pics als einzelne Threads", sondern eher etwas wie: "Process ist zeitlich unabhängig... Daten nicht zwingend benötigt - erwartete Processdauer > x", also eher was allgemeines, was mir auch bei anderen Projekten als meinem Beispiel hilft.

Mir ist durchaus bewusst, das eine Faust Regel nicht immer trifft und evtl sogar mal kontra produktiv ist, aber es muss doch sowas in der art geben wie, "wann denke ich daran einen Thread zu erstellen, wann garantiert nicht".


Zuletzt bearbeitet von DennisHB am Do 21.05.09 03:08, insgesamt 2-mal bearbeitet
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19314
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 21.05.09 01:40 
Grundsätzlich ist für alles ein Thread sinnvoll, was im Hintergrund ohne starke Interaktion mit der Benutzeroberfläche ablaufen kann und etwas länger dauert. Das heißt insbesondere wo dann am Ende einfach das Ergebnis nur angezeigt wird oder so.

Wenn eine direkte ständige Interaktion erforderlich wäre, dann würde die häufige Synchronisierung den Thread ad absurdum führen.

Zum Durchsuchen der Festplatte ist ein Thread in jedem Fall sehr sinnvoll, denn das kann dann komplett im Hintergrund geschehen wie beim Windows Media Player auch.
Auch das Laden aus dem Internet mache ich meistens im Thread, da ich so parallel mehrere Anfragen stellen kann und so das ganze deutlich schneller geht.

Zu extrem darf so etwas natürlich nicht werden. Also zu viele Threads sind auch wieder nicht sinnvoll, auch was die Belastung des Webservers angeht. Für einen solchen Fall sollte eine Warteschlange benutzt werden (da gibts ja z.B. TQueue, wenn man nichts eigenes machen möchte), aus der sich ein Thread dann (synchronisiert natürlich) jeweils den nächsten Job abholt. So hat man dann eine feste Anzahl an Threads, die sich ihre Jobs selbsttätig abholen und schlafen, wenn nichts zu tun ist z.B.
DennisHB Threadstarter
Hält's aus hier
Beiträge: 5

Win XP
D6
BeitragVerfasst: Do 21.05.09 02:04 
Das ist grob schon mal was ich suche - Vielen Dank - leider noch ein wenig zu grob :) (oder soweit war ich auch schon)

Aber speziell, da Du (Sie, will ja nicht frech sein) es ansprichst... Inet Aufrufe (meine Erfahrung spricht für ca 3 Threads gleichzeitig) gibt es da (andere) Erfahrungswerte...

Auch sowas würde ich hier gerne als Antwort sehen... z.B. aus meiner Erfahrung: 3 Threads für InterNet-Seiten aufrufen + auswerten(parsen/DOM-erstellen) - ist bei mir das Optimum.

Wie gesagt es geht mir hier um Threads allgemein, wann & wie sinnvoll einsetzen... voraus gesetzt es lässt sich sowas wie eine Faust-Formel "erstellen"... probieren gehört am ende sicherlich je Project-Aufbau dazu.

Aber eine Hausnummer - 1 Thread zum "scannen von 'Laufwerken'" oder 1 Thread pro "'Laufwerk' zum scannen" macht evtl schon nen riesen unterschied (besonders wenn dann noch jmd erklären kann ab wie viel "Laufwerken / Realen Medien" sich welche Lösung besser eignet.

(Edit : um das ganze zu erweitern - ich habe Local 7 Datenträger + (bis zu) 4 Netzlaufwerke + ein paar Netz/Inet Verbindungen (zurück zu meinem Bsp.Prog - es soll ganz klar nur angezeigt werden was auch verfügbar ist, daher geh ich evtl so sehr auf die Netz-/Laufwerk-suche ein :) - "DatenMedium nicht erreichbar = gibt es nicht, ist leicht" --> "Doch wenn Medium erreichbar, wie optimal den Daten-Bestand bestimmen?) - egal, bleiben wir bei dem Versuch eine Faust-Regel zu finden, wann sich ein Thread lohnen könnte (den Grund-Gedanken hat "jaenicke" denke ich schon schön formuliert).