![]() |
Performanceprobleme in Verbindung mit leerer MemTable
Liste der Anhänge anzeigen (Anzahl: 1)
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ß |
AW: Performanceprobleme in Verbindung mit leerer MemTable
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:
nicht aus?
procedure TForm1.Button1Click(Sender: TObject);
begin Form2.Show; end; |
AW: Performanceprobleme in Verbindung mit leerer MemTable
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. |
AW: Performanceprobleme in Verbindung mit leerer MemTable
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. |
AW: Performanceprobleme in Verbindung mit leerer MemTable
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. |
AW: Performanceprobleme in Verbindung mit leerer MemTable
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? |
AW: Performanceprobleme in Verbindung mit leerer MemTable
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; |
AW: Performanceprobleme in Verbindung mit leerer MemTable
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:20 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-2025 by Thomas Breitkreuz