![]() |
Programm wird zur Laufzeit immer langsamer
Hallo,
ich stell mal hier jetzt ein neues Thema ein, weil ich die Hoffnung habe, das mir hier unter allgemeine Frage vieleicht jemand helfen kann. Ich habe eigendlich die Frage schon mal an einem vorhanden Thread von mir angehangen, aber da es ja eigendlich ein neues Thema ist, verweise ich an dieser Stelle mal auf den alten Thread, und hoffe das mir jemand hier unter dem neuen Thread helfen kann.. ![]() Ich habe meine Programm jetzt mit viele Haltepunkten und sonstigen Versuchen geprüft. Leider ohne Großen Erfolg. Es muss irgendwo ein Problem sein, was ich mit Haltepunkten nicht finden kann. Ich bau über einen Button eine Verbindung zur COM Schnittstelle auf, über die ich Daten empfange. Lass ich mein Programm eine weile laufen, (Daten werden in VST zur anzeige gebracht) merkt man das das Programm langsam geworden ist. Allerdings, kann es nicht sein, das es am belegen des Speichers liegt, da mein PC trotzallem sich normal bedienen lässt. Erkenne, kann man den Fehler z.B. daran, wenn man das Programm minimiert und wieder maximiert, dauert es ewig, bis das VST neu gezeichnet wird. Oder, trenne ich die Verbindung zur COM Schnittstelle, ist es das selbe.Der Trennvorgang dauert so lange, das man fast das Gefühl hat, das Programm wäre abgestürtz. Vieleicht kann mir ja jemand sagen, wo das dran liegen könnte. Gruß Jens |
Re: Programm wird zur Laufzeit immer langsamer
Wenn du eine dieser Wartephasen hast, kannst du ja mal die Anwendung (vorausgesetzt, sie läuft im Debugger) unterbrechen und den Call-Stack untersuchen.
Oder du könntest das Programm mal in einem ![]() |
Re: Programm wird zur Laufzeit immer langsamer
Zitat:
|
Re: Programm wird zur Laufzeit immer langsamer
Zitat:
|
Re: Programm wird zur Laufzeit immer langsamer
Ach so... :duck:
Naja, ich geh trotzdem einfach mal davon aus, dass meine Grundaussage stimmt. ;) |
Re: Programm wird zur Laufzeit immer langsamer
Eigentlich ist ja die Idee, dass diese Virtual Controls in ihrer Geschwindigkeit unabhängig sind vom Inhalt.
Evtl. liegt hier ein allgemeiner Denkfehler über das Verhalten von Windows vor. Wenn mein Programm die Auslagerungsdatei nutzt (und damit langsamer wird), weil es zu viel Speicher benötigt, muss das noch nicht zwingend nachteilig für andere Programme sein. |
Re: Programm wird zur Laufzeit immer langsamer
Der Aufruf von "VSTFüllen" im FormCreate ist nicht sehr geschickt.
Wie soll der Anwender wissen was los ist, wenn er nichts sieht? Vieleicht in den erstmaligen Aufruf von FormActivate verlagern. Dann die Anzahl der Datensätze ermitteln "select count(id) ..." und einen Fortschrittsanzeige beim Lesen der eigentlichen Daten. In der Methode TreeViewResult werden einige Tempvariablen benutzt, warum nicht gleich das Datenobjekt nehmen? Der Insert ist soweit ok, aber gibt es vor dem Insert keine Möglichkeit sich von der Datenbank eine neue ID zu holen? Dann könnte man sich das Lesen des gerade eingefügten Datensatzes sparen. Falls die Datenbank nicht diese Möglichkeit bereitstellt, würde ich über den Einsatz von GUID als Primärschlüssel nachdenken. Die können dann auf dem Client vergeben werden. Das Select mit anschließendem Last ist an dieser Stelle aber eine Katastrophe. Hier wird praktisch die gesamte Tabelle gelesen, nur um ein Datenobjekt zu füllen, dessen Inhalt schon bekannt ist. Einfach ein Select max(ID) ... natürlich in der selben Transaktion wie der Insert würde genügen. |
Re: Programm wird zur Laufzeit immer langsamer
Hallo zusammen,
Danke erstmal für die vielen, vielen antworten. Ich muss leider momentan immer viel arbeiten, und konnte mich bislang noch nicht intensiv mit den anworten befassen. Ich habe sie zwar alle gelesen, nur noch nicht intensiv versucht Sie umzusetzen. Also, bitte nicht glauben ich hätte kein Interesse an Euren antworten. Gruß Jens PS. Heute und Morgen Abend, werde ich mich dem Problem mal wieder widmen. |
Re: Programm wird zur Laufzeit immer langsamer
Hallo zusammen,
hat alles super geklappt. Habe jetzt die gesamte Funktion umgebaut und es scheint zu funtionieren. Werde jetzt mal einen Testlauf bis heute Abend machen, und schauen ob es dann noch funktioniert. Folgende Lösung, habe ich jetzt um neue Einträge in mein VST einzufügen.
Delphi-Quellcode:
Ich hoffe das ist so alle OK.
procedure TForm1.TreeViewResult(ParserTreeView: TMyBaseParser);
var Daten : TOMB256PLUS; begin QryMB256PLUS.Close; QryMB256PLUS.SQL.Text := 'INSERT INTO MB256PLUS'+ '("LfdNr", "Datum", "Uhrzeit", "Ereignis", "Teilnehmer", "Bereich")'+ 'VALUES(:LfdNr,:Datum,:Uhrzeit,:Ereignis,:Teilnehmer,:Bereich)'; QryMB256PLUS.ParamByName('LfdNr').AsInteger := ParserTreeView.Entries[0].LfdNr; QryMB256PLUS.ParamByName('Datum').AsString := ParserTreeView.Entries[0].Datum; QryMB256PLUS.ParamByName('Uhrzeit').AsString := ParserTreeView.Entries[0].Uhrzeit; QryMB256PLUS.ParamByName('Ereignis').AsString := ParserTreeView.Entries[0].Ereignis; QryMB256PLUS.ParamByName('Teilnehmer').AsString := ParserTreeView.Entries[0].Teilnehmer; QryMB256PLUS.ParamByName('Bereich').AsString := ParserTreeView.Entries[0].Bereich; QryMB256PLUS.ExecSQL; ConMB256PLUS.Commit; QRyMB256PLUS.Close; QryMB256PLUS.SQL.Text := 'Select Max(ID) As ID From MB256PLUS'; QryMB256PLUS.Open; VST.BeginUpdate; Daten := TOMB256PLUS.Create; with Daten do begin Daten.ID := QryMB256PLUS.FieldByName('ID').AsInteger; Daten.LfdNr := ParserTreeView.Entries[0].LfdNr; Daten.Datum := ParserTreeView.Entries[0].Datum; Daten.Uhrzeit := ParserTreeView.Entries[0].Uhrzeit; Daten.Ereignis := ParserTreeView.Entries[0].Ereignis; Daten.Teilnehmer := ParserTreeView.Entries[0].Teilnehmer; Daten.Bereich := ParserTreeView.Entries[0].Bereich; end; VST.AddChild(nil, Daten); VST.ScrollIntoView(VST.GetLast, true); VST.EndUpdate; QRyMB256PLUS.Close; DataMB256plus := ''; end; Ich werde aber auch alle anderen Ideen, die genannt wurden nochmal prüfen, um eventuell noch ein bißchen an Performance zu sparen. Danke schon mal an alle. PS: Diese antwort gebe ich auch auf den anderen Thread, Damit auch jeder bescheid weis. |
Re: Programm wird zur Laufzeit immer langsamer
Die Max(ID) wird nicht in der selben Transaktion gelesen, in der der Datensatz eingefügt wird.
Im Prinzip kann in der Zwischenzeit z.B. auf einem anderen Client ein weiterer Datensatz eingefügt sein, dessen ID jetzt gelesen wird. Auf jeden Fall wird dadurch eine weitere Transaktion gestartet, die aber auch wieder geschlossen werden sollte. Jede Transaktion, auch wenn nur Daten gelesen werden, so schnell wie möglich schließen. Transaktionen, die über lange Zeit offen bleiben, belasten den Datenbankserver unnötig. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:06 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz