AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Anwendungs-GUI wird immer 'klebriger'. Wieso?

Ein Thema von alzaimar · begonnen am 19. Dez 2009 · letzter Beitrag vom 20. Dez 2009
Antwort Antwort
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
Benutzerbild von sirius
sirius

Registriert seit: 3. Jan 2007
Ort: Dresden
3.443 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Anwendungs-GUI wird immer 'klebriger'. Wieso?

  Alt 19. Dez 2009, 21:18
Die Indy-Komponenten (ich kenne nur Version 9) sind eher so aufgebaut, dass man diese nicht in Threads legen sollte. Sie arbeiten intern mit TThread, welcher wiederum mit Synchronize arbeitet um gewisse Ereignisse in den aufrufenden Thread (wo Indy initialisiert wurde) zu leiten. Synchronize ist aber dafür ausgelegt sich NUR mit dem MainThread zu synchronisieren, da es über das globale Application-Objekt arbeitet. Jetzt könnte ich mir an dieser Stelle vorstellen, dass das Application-Objekt so nach und nach überläuft und deswegen nicht mehr in den idle Zustand kommt.

War jetzt nur so meine erste Idee.

Edit: Warum legt man Socket-Komponenten in einen Thread, wenn man sie dann auf Non-Blocking setzt?
Dieser Beitrag ist für Jugendliche unter 18 Jahren nicht geeignet.
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#3

Re: Anwendungs-GUI wird immer 'klebriger'. Wieso?

  Alt 19. Dez 2009, 21:29
Hallo alzaimar;

Zitat von alzaimar:
Tja, wie soll ich anfangen?
Speicherauslastung:
Wird das Programm erst zäh wenn der Speicherverbrauch steigt?
Kann ein Hinweis sein, das TStrings von TStringListen und oder Memos voll laufen.

GDI-Objecte (Handles) laufen über:
Kontrols werden nicht mehr korrekt gezeichnet.

Suchen in allen Dateien nach Sleep:
Es Sollten keine Treffer angezeigt werden.
Zum Synchronisieren und Warten sind Sleeps ungeeignet.

Suchen in allen Dateien nach Processmessages:
Auch hier gilt, vollkommen ungeeignet um auf etwas zu warten oder zu sysnchronisieren.

Sampling Profiler Verwenden.

Für Hochlast TCP-IP Anwendungen keine Komponenten verwenden, nativeen Transport codieren.


lg. Astat
Angehängte Dateien
Dateityp: rar samplingprofiler-1.7.4_897.rar (548,0 KB, 11x aufgerufen)
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Benutzerbild von thkerkmann
thkerkmann

Registriert seit: 7. Jan 2006
Ort: Pulheim Brauweiler
464 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Anwendungs-GUI wird immer 'klebriger'. Wieso?

  Alt 19. Dez 2009, 21:35
Hi,

ich sehe das wie Sirius: Keine non-blocking Socket Komponenten in Threads (Ok, ich bin ein Fan von synapse).

Und ich würde mir sehr genau das String Management ansehen. Eventuell muss das optimiert werden.
Memos sind zum Loggen auch nicht wirklich geeignet. Habe da bessere Erfahrungen mit Listboxen gemacht. Max. 4k Zeilen und dann die unteren wieder wegnehmen. Und schön Lines.BeginUpdate/EndUpdate verwenden.

Gruss
Thomas Kerkmann
Ich hab noch einen Koffer in Borland.
http://thomaskerkmann.wordpress.com/
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.139 Beiträge
 
Delphi 12 Athens
 
#5

Re: Anwendungs-GUI wird immer 'klebriger'. Wieso?

  Alt 19. Dez 2009, 21:48
Du hast ja "massenhaft" Threads ... greifen diese eventuell zu oft auf die GUI zu?
(sowas sollte ja synchronisiert sein, was bei übermäßigem Zugriff arg ausbremst)

Zitat:
Hat MSXML seine Finger im Spiel?
Wieviel verwendest du davon?
(ist ja nicht der schnellste)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

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

Re: Anwendungs-GUI wird immer 'klebriger'. Wieso?

  Alt 19. Dez 2009, 22:28
Zitat von sirius:
Die Indy-Komponenten ... mit Synchronize arbeitet...
Dachte ich mir... Werde ich wohl ändern.
Zitat von sirius:
Warum legt man Socket-Komponenten in einen Thread, wenn man sie dann auf Non-Blocking setzt?
Spielerei. Könnte ich auch auf "blocking" setzen, aber erstmal muss man verstehen, um es zu ändern. Ich habs nun kapiert, dank ...

Zitat von Astat:
Speicherauslastung?
Nein. Das ist sauber. Hab schon FastMM drübber laufen lassen.
Zitat von Astat:
GDI-Objecte (Handles) laufen über:
Sollte ich das Uralt MemProof mal drüber laufen lassen?
Zitat von Astat:
Suchen in allen Dateien nach Sleep,... Processmessages...
Zitat von Astat:
Sampling Profiler Verwenden.
Zum Bleistift? Irgendwas, was umme is?
Zitat von Astat:
Für Hochlast TCP-IP Anwendungen keine Komponenten verwenden, nativen Transport codieren.
Bin ich sonst kein Freund von (lieber Baukastenprinzip). Aber das das in die Hose gehen kann, sieht man an den Indies
Zitat von thkerkmann:
ich sehe das wie Sirius: Keine non-blocking Socket Komponenten in Threads
Ist doch nur overkill, aber keine Bremse, oder?
Zitat von thkerkmann:
Memos sind zum Loggen auch nicht wirklich geeignet. Habe da bessere Erfahrungen mit Listboxen gemacht. Max. 4k Zeilen und dann die unteren wieder wegnehmen. Und schön Lines.BeginUpdate/EndUpdate verwenden.
Nee, nee, ich schnippel die schon auf max 100 Zeilen.
Zitat von himitsu:
Du hast ja "massenhaft" Threads ... greifen diese eventuell zu oft auf die GUI zu?
Derzeit ca. 30-40. Teilweise Quatsch, aber von mir aus kann das lahm sein. Aber es soll eben micht zulaufen.
Zitat:
Hat MSXML seine Finger im Spiel?
Pro TCP-Client 1x pro Sekunde ein Telegramm. Hab ja schon an Himicks-ml gedacht...

Also: Ich schmeiss die Indies komplett raus und suche nach 'Sleep' und 'ProcessMessages' und dampfe die Threads mal ein.

Ich hab den Server (Indy) auch im Verdacht, weil die Anwendung schon zuckelt, wenn ich mal 1.6MB XML verschicke, und das in einem Thread. Sollte man ja eigentlich gar nicht merken...

Wie gesagt: Es ist keine Hochlastanwendung und muss nicht optimiert werden. Es reicht mir, wenn die Anwendung stabil läuft. Erstmal.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#7

Re: Anwendungs-GUI wird immer 'klebriger'. Wieso?

  Alt 19. Dez 2009, 23:24
Hallo alzaimar.

Zitat von alzaimar:
Also: Ich schmeiss die Indies komplett raus und suche nach 'Sleep' und 'ProcessMessages' und dampfe die Threads mal ein.

Ich hab den Server (Indy) auch im Verdacht, weil die Anwendung schon zuckelt, wenn ich mal 1.6MB XML verschicke, und das in einem Thread. Sollte man ja eigentlich gar nicht merken...

Wie gesagt: Es ist keine Hochlastanwendung und muss nicht optimiert werden. Es reicht mir, wenn die Anwendung stabil läuft. Erstmal.
Als Faustformel gilt: Maximal 8 Threads per CPU um die Kosten (Threadscheduling, Stack-Sicherung usw.) gering zu halten.

Wenn Du Verwendung dafür hast, kannst du beigelegte Native Socket Libraries verwenden.
Diese sind getestet (WAN mit 50000 Client PC's) und über mehrere Jahre hinweg stetig weiterentwickelt worden.
Samples incl Source wie die DLL's zu verwenden sind, ist beigefügt.
Die Verwendung ist denkbar einfach.

Mit Connect eine Verbinden aufbauen.
In der Methode send kannst Du beliebige daten senden, der Rest (Header, Kompression, Empfangsbuffer Aufbereitung usw.)
erledigt die Dll unsichtbar im Hintergrund, also wie eine Komponente als Black Box.

Lg. Astat
Angehängte Dateien
Dateityp: rar socketlibraries_287.rar (842,7 KB, 21x aufgerufen)
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
WoGe

Registriert seit: 16. Jun 2005
Ort: Kelkheim
178 Beiträge
 
Delphi 10.3 Rio
 
#8

Re: Anwendungs-GUI wird immer 'klebriger'. Wieso?

  Alt 19. Dez 2009, 23:31
Zitat von alzaimar:
Wie gesagt: Es ist keine Hochlastanwendung und muss nicht optimiert werden. Es reicht mir, wenn die Anwendung stabil läuft. Erstmal.
Schau mal, ob alle Indices vorhanden bzw. angeschaltet sind. Ich habe das mal bei einem Programm gehabt, das ein abgeschalteter Index für hohe CPU-Last gesorgt hat und das in dem Proggie, das die Daten geliefert hat nicht mehr viel ging.

Gruss wo
  Mit Zitat antworten Zitat
Astat

Registriert seit: 2. Dez 2009
Ort: München
320 Beiträge
 
Lazarus
 
#9

Re: Anwendungs-GUI wird immer 'klebriger'. Wieso?

  Alt 20. Dez 2009, 00:15
Zitat von alzaimar:
Zitat von Astat:
Speicherauslastung?
Nein. Das ist sauber. Hab schon FastMM drübber laufen lassen.
Hallo alzaimar, hab hier an den Taskmanager (DasBesagteProgramm.exe) und an Speichernutzung und Virtueller Speicher gedacht.
Dass ein Memoryleake vorhanden ist, hab ich sowiso bei dir nicht angenommen!!

lg. Astat
Lanthan Astat
06810110811210410503210511511603209711003210010110 9032084097103
03211611111604403209711003210010110903210010510103 2108101116122
11610103209010110510810103206711110010103210511003 2068101108112
10410503210310111509910411410510109810111003211910 5114100046
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 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