Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Performanceprobleme in Verbindung mit leerer MemTable (https://www.delphipraxis.net/210381-performanceprobleme-verbindung-mit-leerer-memtable.html)

schaumermal 15. Apr 2022 12:56

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ß

Delphi.Narium 15. Apr 2022 14:44

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:
procedure TForm1.Button1Click(Sender: TObject);
begin
  Form2.Show;
end;
nicht aus?

schaumermal 15. Apr 2022 17:15

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.

Delphi.Narium 15. Apr 2022 17:25

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.

schaumermal 15. Apr 2022 17:48

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.

Delphi.Narium 15. Apr 2022 18:46

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?

juergen 15. Apr 2022 22:41

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;

DeddyH 16. Apr 2022 12:05

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 01:45 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