Einzelnen Beitrag anzeigen

alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Anwendungs-GUI wird immer 'klebriger'. Wieso?

  Alt 19. Dez 2009, 21:05
Tja, wie soll ich anfangen?

Diese Mist-Applikation ist ziemlich optimiert und ganz brauchbar implementiert; die GUI reagiert sofort (kein Wunder, ist ja alles in Threads organisiert). Was sie macht? Daten sammeln, in einer DB puffern und später zusammensuchen und weiter verschicken.

Zum Aufbau: 7 TCP-Threads empfangen ein paar Daten (XML, ca 10k pro Sekunde) und speichern die Daten mit den IB-Komponenten in einer Firebird-DB. Das Datenbankhandling übernimmt ein Workerthread, der die Daten streng sequentiell in die DB einpflegt, um Deadlocks zu vermeiden. Die Performance ist wirklich ok: Pro Sekunde werden 500 Datensätze plus einige Texte geschrieben.

Dann ist da noch ein (Indy) TCP-Server, der die Daten verschickt (auch in einem Thread).

Kontrollausgaben (Logging) erfolgt in 7 Memos über Window-Messages: Wenn es in irgend einem Thread etwas zu loggen gibt, wird der Text in einer Stringliste abgelegt und das Hauptformular per PostMessage angewiesen, diesen Text in einem der 7 Memos anzuzeigen. Das Befüllen der Memos erfolgt in einer separaten Message-Prozedur.

Daneben gibt es noch ein TChart, um einige Statistiken anzuzeigen, die durch einen Timer angezeigt werden. Das Problem besteht auch, wenn er Chart nicht neu gezeichnet wird.

Soweit zur Architektur.

Das Problem ist nun, das die Anwendung immer 'klebriger' wird, d.h. auf Mausklicks immer träger reagiert.
In einer Installation, auf die ich nur per VNC rankomme, wird die GUI fast gar nicht mehr neu gezeichnet: Nur die Hintergründe von Panels sowie die Memos und Umrandungen einer Listbox werden neu gemalt, wenn man mit einem anderen Fenster (Taskmanager, warum wohl ) über das Hauptformular fährt.

Wie kann das sein?
Wie kommt es dazu, das eine Anwendung immer klebriger wird, bis sie gar nicht mehr reagiert?
Läuft die MSQ über?
Dann würden aber die Log-Memos nicht geupdatet werden, oder?
Kann der Zugriff aud die Firebird-DB mit IB-Komponenten dazu führen (von einem Workerthread aus)?
Hat MSXML seine Finger im Spiel?
Vista?
Die Illuminaten?
Hansa?

Erschwerend kommt noch hinzu, das ich bei der Kundenanwendung per VNC nicht mitbekomme, das die Anwendung klebriger reagiert. Wenn ich nach einigen (2-16) Stunden nachschaue, ist entweder alles in Butter oder es geht gar nix mehr.

Das mit dem 'langsam klebriger werden' sehe ich nur in einer Simulation, die aber nicht komplett das reale Szenario wiederspiegelt.

Nochmal die Fakten:
7 x TCP-Thread (non blocking, im Thread mit eigener MSQ), ca. 10k pro Sekunde, MSXML, Daten per separatem Workerthread und IB-komponenten in eine Firebird-DB.
1 x Indy-TCP-Server in separatem Thread, verschickt Daten (über den DB-Workerthread auslesend).
Log-Ausgaben per individuellen Threads und Postmessage an die Hauptanwendung.
1 x Steema-Chart für Statistik, die per Windows-Timer 1x pro Sekunde angepasst wird.

Könnt ihr mir ein paar Denkanstöße geben, was ich noch einbauen oder wo ich suchen kann?
Steh hier völlig im Regen, hab das Logging schon ausgetauscht, den TCP-Client neu gebaut. Wattennunochallet?
Ich hab schon einen Sentinel, der per SendMessageTimeout prüft, ob die MSQ des Hauptformulars hängt (Timeout 5 Sekunden), aber seit dem ich den installiert habe, funktioniert natürlich alles (Dauert eben bis zu 16 Stunden, bis es mal wieder hängt).
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat