Einzelnen Beitrag anzeigen

backdraft

Registriert seit: 19. Apr 2005
Ort: Hückeswagen
333 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Datenübergabe aus Thread in MainForm

  Alt 11. Okt 2022, 19:34
Zitat:
Es auf 1 Sekunde zu verlängern bringt auch nix, dann braucht er 10 mal so lang zum verarbeiten der Daten.
Da has du doch schon das eigentliche Problem?
Ja und nein.
Die lokale DB schafft einfach mehr Daten herbei, als der MainThread verarbeiten kann.
Deswegen habe ich das Intervall auf 100ms gesetzt.

Mit einer RemoteDB kommen pro 100ms ca. so viele Daten an, dass der MainThread diese in weniger als 5ms verarbeiten kann.
In der Regel kommen hier maximal 500k.

Bei der lokalen dauert es manchmal mehr wie 100ms, somit kommt er dann in den Loop, dass er nicht mehr Luft hat in der App auf Benutzeraktionen zu reagieren.
Würde der Thread mit dem Senden einer weiteren Nachricht warten, bis der MainThread 10ms Luft hatte wäre alles in Ordnung.

Wir reden aber auch von 5MB, die der Thread in 100ms zerlegen muss.
Das sind einfach sehr viele Daten.
Binary Daten werden auch auf der HDD zwischengespeichert.
Ich habe eine NVME, es gibt sicherlich aber auch noch HDD Benutzer. Somit dauert das Schreiben hier auch wieder länger.

Je höher das Intervall auch ist, desto länger Freezed die Anwendung ja auch bei der Verarbeitung von einem Block.
Deswegen passt 100ms ganz gut, da merkt der Anwender in der Regel nix... In der Regel aber halt nur

Ich habe auch eine Datenpool Klasse die Threadsafe Daten aus dem Thread aufnehmen kann und im MainThread anzeigen kann.
Als Darstellung nutze ich den VirtualStringTree.
Jede Zelle die er zeichnet, setzt eine Sperre auf den Pool, was auch nicht so performant ist.

Letztendlich habe ich mich aktuell dazu entschieden, die Daten via Message zu übertragen, weil die Performance dabei einfach besser ist und ich nicht so viele Locks produziere. Der Austausch der Daten via TOmniValue funktioniert hervoragend und auch sehr performant.

Wir reden hier generell vom Zeiten, die mich stören.
Der Endanwender wäre mit beiden Lösungen sicherlich zufrieden.

Vom Prinzip stört mich einfach, dass hier ein Bottleneck ist, was ich nicht beziffern kann.
Ich kann nur "meinen Computer" als Basis für die Zeit nehmen.

Aus unserer Diskussion schließe ich aber, dass es scheinbar nichts in der OTL gibt.

Eine Boolean Variable "Paused" im Task würde ja das Problem schon lösen, sowas werde ich sicherlich auch einbauen.

Danke für Deine Hilfe ...
Oliver

Geändert von backdraft (11. Okt 2022 um 19:39 Uhr)
  Mit Zitat antworten Zitat