Hallo zusammen,
ich weiß, dass ich hier eine ziemlich offen Frage stelle, aber ich weiß im Moment nicht so recht wo ich ansetzen soll.
Ich habe eine Anwednung die während der Laufzeit per RS232 Daten von einem Gerät abfragt, in die Datenbank schreibt, laufende Messergebnisse in zwei Charts darstellt und ein Teil der Daten in einem VirtualStringTree darstellt.
Nun besteht das Problem, dass die Anwendung nach 2 Tagen Laufzeit 2..3 s benötigt um z.B. nach Klick auf einen Button Daten per RS232 abzufragen. Nach dem Click erscheint die Windows-Sanduhr und 2..3 sec später sieht man die Daten am Splitterkabel, das ich zu Überwachungszwecken an die RS232 gehängt habe. Die Antwortzeit des Geräts selber liegt im ms-Bereich. Nach 4 Tagen Laufzeit sind es schon 5..6 s. Das Öffnen des Explorers geschieht normal. Es ist nur mein Programm, das langsamer wird
- Alle 5s werden Temperatur, Drehzahl und Status abgefragt.
- Alle 2 Minuten werden diese in einem Chart dargestellt und in DB geschrieben.
- Alle 60 Minuten werden 8 Messwerte erfasst. d.h. nach 2 Tagen hat man 48 solcher Messpunkte. Es sind also keine großen Datenmengen, die da anfallen.
- Zu Testzwecken habe ich den 60 Min-Intervall auf 4Min verringert. D.h. jetzt sind die Messungen nach 4h abgearbeitet => Kein Problem mit der Laufzeit => Es liegt wohl nicht daran, dass die Messpunkte ein Datenloch erzeugen
- Ich habe die 2 Minuten logs abgeschalten => Nach 2 Tagen ist Anwendung wieder langsam => Es liegt wohl auch nicht am Log der 2-Minuten Daten
- Ich habe die Darstellung in den Charts deaktiviert => Keine Verbesserung
- Ich habe den Speicherverlauf geloggt. GetMemSpace erhöht sich nach 2.5 Tagen von 26'100 auf 26'327 kByte und M.dwAvailVirtual verringert sich von 1'582'312 auf 1'576'936 kByte => Erscheint mir auch nicht auffällig
Delphi-Quellcode:
function GetMemSpace: Integer;
// *****************************************************************************************************************************************
// Emittelt den Speicherbedarf der aktuellen Anwendung
var
State: TMemoryManagerState;
i: Integer;
begin
GetMemoryManagerState(State);
Result := 0;
for i := 0 to high(State.SmallBlockTypeStates) do
Inc(Result, State.SmallBlockTypeStates[i].AllocatedBlockCount * State.SmallBlockTypeStates[i].UseableBlockSize);
Inc(Result, State.TotalAllocatedMediumBlockSize + State.TotalAllocatedLargeBlockSize);
end;
// Alle 10 Minuten loggen (60 x 5s)
if (Tag = (Tag div 12) * 12) then
begin
M.dwLength := SizeOf(M);
GlobalMemoryStatus(M);
GetLogger.Debug('MemLog', format('Used Memory = %11.0n / %14.0n kB', [GetMemSpace / 1024, M.dwAvailVirtual / 1024]));
end;
Jetzt fehlt mir eine Idee was ich noch machen kann, um herauszufinden, warum die Anwendung im Verlauf von Tagen langsamer wird.
Programm ist mit Delphi XE erstellt
Danke für jede Hilfe
Gerd