Autor Beitrag
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Di 25.06.13 17:25 
Hallo, ohne jetzt den Code Complett zu analysieren, versuche doch erst einmal, eine kapselung der beiden klassen Mainform und Thread. Ich sehe hier viele kreuzreferenzen, die es schwer machen, den code zu lesen. Und zu verstehen. Einerseits erstellst du einen thread, startest ihn aber ueber die Mainform. Bedenke, das suspend/resume veraltet sind. Du rufst funktionen im Thread auf, die nicht im Construktor gesetzt werden, sondern wiederrum spaeter in der Mainform... Das ganze ohne Fehlerpruefung. Execute hat viele lokale variablen, versuche auch hier strukturen oder Properties zu verwenden. Ab d2009 koennen Records auch Methoden haben. Das eignet sich sehr gut diese zu initalisieren. Vermeide die globale Variable. Falls unbedingt notwendig, stelle sicher, das der Zugriff nur via criticalsections erfolgt.
Viele Gruesse
Msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
NOS1971 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 193

Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
BeitragVerfasst: Di 25.06.13 20:08 
Hi,

hmmm ... also es ist deshalb getrennt vom mainform weil ich es gern vom form entkoppelt habe ... die kreuzreferenzen die du meinst ergeben sich nur aus dem syncen so wie ich das sehe und was ja auch für das sichere handeln des listviews wichtig ist ... also wie ich sehe ist es scheinbar das problem das nicht alle items im listview durch die getnextanalyseitem routine erfasst werden oder als "analysed = true" gehandelt werden .... der zugriff auf den activethreads counter erfolgt auch im gesyncten teil und am ende des durchlaufes bleiben auch 0 threads in counter ... also scheint das auch alles ok ...

ich pack mal den source dazu
Einloggen, um Attachments anzusehen!
NOS1971 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 193

Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
BeitragVerfasst: Mi 26.06.13 12:19 
So ...

es war mal wieder wie so oft der zu lange blick auf den eigenen source ... ich habe nach allem gesucht aber letzten endes fehlte nur ein setzen des analysed flags in dem Record beim anlegen des datensatzes und des listitems :-) mal schauen wie weit ich nun komme :)

Bis hierher vielen Dank :)

Andreas
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: Mi 26.06.13 13:08 
Das Problem ist an dem Quelltext das Konzept. Du verbandelst da GUI und Daten und Threads fest miteinander. Viel sinnvoller wäre es, wenn du deine Daten separat verwalten würdest, die Threads daran anbinden würdest, und dann die Daten in der GUI nur anzeigen würdest.

Erstens würde es dann viel einfacher werden, da die einzelnen Teile übersichtlicher würden, andererseits auch schneller, da die GUI weniger durch Synchronisierungen warten muss und du einfacher mehrere Threads parallel nutzen kannst. Und außerdem wäre es auch ein saubereres Konzept.
NOS1971 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 193

Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
BeitragVerfasst: Mi 26.06.13 13:14 
Du meinst also die Analyseergebnisse in einer TList speichern und erst danach anzeigen oder was genau meinst Du ?
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: Mi 26.06.13 13:33 
Nein, komplett von der TListView losgelöst arbeiten. Du hast eine Liste der aktiven Tasks. Und du synchronisierst die Threads nicht mit dem Haupttthread, sondern benutzt Critical Sections um diese Liste aktuell zu halten. Auf die Weise behindert das die GUI gar nicht.
Bei Änderungen der GUI schickst du deiner GUI z.B. eine Nachricht, eine Windows Message kannst du ja auch ohne Synchronisierung schicken.

Deine GUI empfängt diese Message, ist aber schon im Hauptthread, d.h. auch hier ist keine Synchronisierung nötig, du musst auch hier nur mit Critical Sections arbeiten. Wenn es sehr viele Einträge werden können, macht auch eine TVirtualStringTree Sinn, da du dann nur die angezeigten Elemente aktualisierst, das macht es noch schneller.

Wenn das gut gemacht ist, hast du eine sich sehr performant anfühlende Anwendung, die die Möglichkeiten von Threads auch wirklich ausnutzt.
NOS1971 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 193

Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
BeitragVerfasst: Mi 26.06.13 13:48 
Hi,

vielen Dank für die Tipps ... da habe ich noch einiges vor mir ... ich werde das dann mal versuchen stück für stück umzusetzen ... ich bin mal gespannt wie es klappt :-)

Grüße und Dank,
Andreas
NOS1971 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 193

Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
BeitragVerfasst: Sa 29.06.13 19:57 
ich bin grad mitten in der umsetzung und frage mich ... was ist wohl effektiver bei mehr als 25000 datensätzen

1. TStringList
2. TList
3. variables Array of records

beim adden muss ich immer einen string auf vorhandensein prüfen wegen der duplicates

Ich neige ja zum Array ... aber sicher bin ich mir nicht.
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: Sa 29.06.13 20:08 
Das hört sich für einen typischen Anwendungsfall für TDictionary an (Unit System.Generics.Collections). ;-)
Da werden die Einträge gehasht und man kann mit Contains schnell herausfinden, ob ein Eintrag schon drin ist.

Für diesen Beitrag haben gedankt: NOS1971
NOS1971 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 193

Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
BeitragVerfasst: Sa 29.06.13 20:12 
Ich sage vielen Dank .... wobei ich ehrlich gestehen muß das ich trotz meiner Arbeit mit Delphi seit Version 3.0 seit 1996 noch nie etwas davon gelesen habe :-)
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: Sa 29.06.13 20:49 
Das funktioniert ja auch erst mit Generics sinnvoll, deshalb gibt es das auch erst seit Delphi 2009 wie auch Generics. ;-)
MSCH
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1448
Erhaltene Danke: 3

W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
BeitragVerfasst: Sa 29.06.13 21:49 
Alternativ waere auch ein tclientdataset oder MemTable moeglich (bei der Menge). Da faellt dann das spaetere binden an die GUI etwas leichter.
Cherio Msch

_________________
ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
NOS1971 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 193

Windows 8.1 PRO 64 Bit
Delphi XE7 Professional
BeitragVerfasst: Di 02.07.13 17:51 
Hi,

so ... ich habe das mal so versucht umzusetzen ... ein TDictionary für die eintragsverwaltung ... messages zum mainform/main thread / virtualtreeview ... den node habe ich um einen reinen pointer erweitert der direkt auf einen eintrag aus der liste zeigt ... kein syncen mehr sondern critical sections :-) .... gibt es noch optimierungsbedarf oder habe ich etwas vergessen und nicht beachtet ? Wenn noch etwas wichtiges fehlen würde bin ich für richtungsweisende tipps immer offen ... ist ja mein erstes multithreading projekt

ich habe den source mal angehangen fürs form und für die unit mit dem threaded spider

Grüße,
Andreas
Einloggen, um Attachments anzusehen!