AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Cross-Platform-Entwicklung Performanceprobleme in Verbindung mit leerer MemTable
Thema durchsuchen
Ansicht
Themen-Optionen

Performanceprobleme in Verbindung mit leerer MemTable

Ein Thema von schaumermal · begonnen am 15. Apr 2022 · letzter Beitrag vom 16. Apr 2022
Antwort Antwort
schaumermal

Registriert seit: 26. Apr 2006
Ort: Bad Vilbel
47 Beiträge
 
Delphi 11 Alexandria
 
#1

Performanceprobleme in Verbindung mit leerer MemTable

  Alt 15. Apr 2022, 12:56
Hallo zusammen,

wer kann mir bei dem folgenden Problem helfen?

Ich habe ein Programm geschrieben in dem ich eine bestimmte Form mehrfach aufrufe.
Nun habe ich festgestellt, dass diese Form immer "langsamer" wird wenn ich diese das 5. bis 6. mal aufgerufen habe.

Anbei ein kleines Testprogramm welches dieses Verhalten zeigt.

Einfach das Programm starten. Die Form 2 über den Button "Show Form2" aufrufen und wieder die Form schließen.
Nach dem 4 Aufruf merkt man schon, dass die Form länger braucht bis sie sich öffnet. Ab dem 5 bzw. 6 mal dauert es ewig.
Wie man dem Code entnehmen kann findet aber keine Aktion vor meiner Seite her statt.

Was ich festgestellt habe ist, dass wenn ich in der Form 2 die Verbindung von BidSourceDB1 (*) zu ListView1 (Synch) trenne, dann tritt das oben beschriebene Phänomen nicht mehr auf.
Auch wenn ich die Daten in der Tabelle eintrage und diese anzeigen lasse tritt das Problem nicht auf.

Kann ich dieses Verhalten umgehen?


Danke und Gruß
Angehängte Dateien
Dateityp: zip performance.zip (94,7 KB, 7x aufgerufen)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#2

AW: Performanceprobleme in Verbindung mit leerer MemTable

  Alt 15. Apr 2022, 14:44
Form2 wird in der DPR erstellt.

Und dann wird jedesmal, im Button1Click ein weiteres Form2 erstellt?

Warum?

Nach dem ersten Button1Click hast Du also 2 Form2, nach dem zweiten Button1Click 3 Form2, nach dem sechsten Button1Click 7 Form2 ... Ist das erforderlich?

Reicht ein
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;
nicht aus?
  Mit Zitat antworten Zitat
schaumermal

Registriert seit: 26. Apr 2006
Ort: Bad Vilbel
47 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Performanceprobleme in Verbindung mit leerer MemTable

  Alt 15. Apr 2022, 17:15
Hi,

ich hatte nur vergessen die Form2 aus dem DPR zu nehmen.

Also wenn die Form aus der Projektdatei nimmt (Formular automatisch erzeugen) ändert dies nichts an dem Phänomen.
Spätestens wenn man die Form2 dann das 6. mal öffnet wird es extrem langsam.

Aber vielleicht sollte ich den Ansatz verfolgen die Form nur einmal zu erstellen.

Geändert von schaumermal (15. Apr 2022 um 17:18 Uhr)
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#4

AW: Performanceprobleme in Verbindung mit leerer MemTable

  Alt 15. Apr 2022, 17:25
Und warum erzeugst Du Form2 mehrfach?

Brauchst Du mehrere Instanzen von Form2 und ggfls. auch mehrere Instanzen der MemTable?

Und wann gibst Du die selbsterzeugten Form2 frei?

Bevor wir hier jetzt anfangen nach Symptomen und deren Ursachen zu suchen, wäre es eventuell hilfreich, wenn Du mal beschreiben könntest, was Du eigentlich vorhast.
  Mit Zitat antworten Zitat
schaumermal

Registriert seit: 26. Apr 2006
Ort: Bad Vilbel
47 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Performanceprobleme in Verbindung mit leerer MemTable

  Alt 15. Apr 2022, 17:48
Die Form die aufrufe ist eine Scanform.

Bei jedem Scanvorgang (Artikelnummer, Auftragsdaten, etc) wird diese Form aufgerufen.
Die Scanform schließe ich nach erfolgreichem Vorgang mit dem Befehl Self.Close.

Damit müsste die Instanz ja wieder gelöscht werden.
Zumindest wenn ich prüfe if assigned(Scan) bekomme ich immer false zurück.

Aber das oben beschriebene Phänomen tritt trotzdem auf.

Der Ansatz die Form immer nur einmal zu erzeugen und dann nicht mit Self.Close sondern mit Self.Hide auszublenden ist ja mal zumindest ein Ansatz.

Allerdings sehe ich dies eher als Workaround.
Aber wenn es damit geht komme ich zumindest in dem Projekt weiter.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.415 Beiträge
 
Delphi 7 Professional
 
#6

AW: Performanceprobleme in Verbindung mit leerer MemTable

  Alt 15. Apr 2022, 18:46
Das Close freigibt wäre mir neu. Nur beim Hauptformular einer Anwendung führt das Close zum beenden des Programmes. Bei allen anderen Formularen werden die geschlossen und können mit Show wieder angezeigt werden.

Mir erschließt sich nicht, warum die Form nicht in der DPR erstellen und dann mit Show anzeigen und mit Close schließen?

Warum immer eine neue Instanz bilden, wenn es auch ohne geht?
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.164 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Performanceprobleme in Verbindung mit leerer MemTable

  Alt 15. Apr 2022, 22:41
Folgender Code sollte dein Problem beheben:
Delphi-Quellcode:
BEGIN
  IF NOT Assigned( Form2 ) THEN
  BEGIN
    Form2 := TForm2.Create( NIL );
  END;
  Form2.showModal;
  FreeAndNil( Form2 );
END;
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Performanceprobleme in Verbindung mit leerer MemTable

  Alt 16. Apr 2022, 12:05
Ich persönlich habe mir angewöhnt, Formulare, die ausschließlich modal angezeigt werden sollen, aus der automatischen Erstellung auszuschließen und dann die globale Form-Variable zu löschen. Angezeigt werden diese dann so:
Delphi-Quellcode:
var
  frm: TSomeForm;
begin
  frm := TSomeForm.Create(nil);
  try
    if frm.ShowModal = mrOK then
      MachWasMitDerForm;
  finally
    frm.Free;
  end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  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 11:27 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