Nachdem die Antworten auf meine Fragen bzgl. Threads sowie Memory-Leaks mich ein ganz schönes Stück weitergebracht haben (Danke übrigens noch mal
habe ich nun noch ein weiteres Problem.
Meine Anwendung wächst im Laufe der Zeit kontinuierlich (nach 2 h ca. 8 - 10 MB grösser als zu Beginn) enthält aber nach VLD keine MemoryLeaks. Ich habe mir nun eine Beispielanwendung gebaut (folgt morgen, da noch nicht ganz fertig), die nichts weiter macht, als zwischen 2 Anwendungen ein Socket zu öffnen, ein- oder mehrmals ein paar Byte (Fixtext) hin- und wieder zurückzusenden sowie das Socket dann wieder zu schliessen. Interessant ist hierbei für mich die Server-Seite (d.h. die Anwendung, die einen QTcpServer laufen hat, der auf einem Port lauscht und wartet, das die andere Anwendung kontakt aufnimmt).
Diese Anwendung wächst nahezu kontinuierlich an (Abnahme des Speicherbedarfs durch Löschen der Sockets (mittels pSocket->deleteLater()) ist praktisch nicht zu beobachten. Auch ist die Zunahme nicht regelmässig (also z.b. in jedem Cyclus 1 kB) sondern relativ unregelmässig. Selbst im Idle Zustand, wenn also der TcpServer lediglich auf neue Verbindungen wartet, konnte ich eine Zunahme beobachten.
Das ganze ist relativ kritisch, da die Anwendung als Dienst laufen soll, der Automatisierungsrechner mit Datenbanken zusammenbringt. Da ist ein kontinuierlich mehr Speicher benötigendes Programm natürlich nicht wirklich günstig, vor allem, wenn es u.U. Tage ohne Betreuung laufen soll.
vom Prinzipiellen Ablauf her läuft das ganze in etwa so :
Code: Alles auswählen
- QTcpServer instanz wird mit listen() aktiv geschaltet
- bei Signal 'newConnection' wird der Socket übernommen, überprüft, ob schon eine Verbindung besteht (falls ja wird der Socket mittels disconnectFromHost() geschlossen)
- bei Signal 'readyRead' werden die anstehenden Bytes vom Socket gelesen, solange welche verfügbar sind.
- Im Anschluss werden diese Daten einfach wieder zurückgeschickt.
- nach 10 sec. ohne Datenempfang wird der Socket mittels disconnectFromHost() geschlossen.
- bei Signal 'QTcpSocket::disconnected() wird der Socket mittels deleteLater() zur Vernichtung freigegeben
- Gibt es bei der Skizzierten Vorgehensweise irgendwelche bekannten Fallstricke die ein solches Verhalten erklären würden?
- muss ich u.U. bei einer Qt-Applikation generell mit einem solchen Verhalten rechnen (ich denke mal eher nein)
. Sind vielleicht schon aus meiner Skizze Denkfehler oder fehlerhafte Ansätze zu erkennen?
Ein Problem hatte ich übrigens bei der Sendenden Anwendung - wenn ich in der Empfangenden vor dem Antworten nicht alle zur Verfügung stehenden Bytes (while (pSocket->bytesAvailable()) ) gelesen hatte, stürzte mir die andere Anwendung ab. Irgendwie wurde anscheinend innerhalb der Ausführung des sendens schon ein readyRead-Signal ausgelöst und der Slot direkt angesprungen. Dies wurde besser, nachdem ich die connection zw. readyRead und dem zugehörigen Slot auf QueuedConnection umgestellt, und endgültig beseitigt nach der genannten Änderung in der Gegenstelle. Hat hier jemand solche Effekte schon mal beobachtet und kann sie zuordnen?
Danke
Tilman (Räger)