Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Programm wird zur Laufzeit immer langsamer (https://www.delphipraxis.net/130953-programm-wird-zur-laufzeit-immer-langsamer.html)

Jens Hartmann 16. Mär 2009 16:18


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..
Mein alter Thread

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

DMW 17. Mär 2009 09:15

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 Profiler laufen lassen.

Mithrandir 17. Mär 2009 09:35

Re: Programm wird zur Laufzeit immer langsamer
 
Zitat:

Zitat von Jens Hartmann
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.

Da liegt denke ich mal der Fehler. Wie, wo und wann füllst du die Daten in das VTV? (Wofür soll deine Abkürzung eigentlich stehen?). Und von wievielen Daten reden wir eigentlich?

sirius 17. Mär 2009 09:47

Re: Programm wird zur Laufzeit immer langsamer
 
Zitat:

Zitat von Daniel G
(Wofür soll deine Abkürzung eigentlich stehen?).

VST = Virtual String Tree

Mithrandir 17. Mär 2009 09:49

Re: Programm wird zur Laufzeit immer langsamer
 
Ach so... :duck:

Naja, ich geh trotzdem einfach mal davon aus, dass meine Grundaussage stimmt. ;)

sirius 17. Mär 2009 09:52

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.

Blup 17. Mär 2009 11:28

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.

Jens Hartmann 19. Mär 2009 16:56

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.

Jens Hartmann 20. Mär 2009 12:46

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:
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 hoffe das ist so alle OK.

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.

Blup 20. Mär 2009 16:15

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 13:10 Uhr.
Seite 1 von 2  1 2      

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