Anwendung friert beim Öffnen eines Fensters ein

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
luckylynx
Beiträge: 10
Registriert: So 25. Dez 2016, 13:07

Anwendung friert beim Öffnen eines Fensters ein

Beitrag von luckylynx »

Hallo,
mein Programm - Abrechnungsprogramm mit Firebird als DB , SQLDB Controls und programmiert in Lazarus, läuft mit 6 Nutzern soweit Ok bis auf ein Phänomen, dem ich nicht auf die Spur komme.
Die Anwender geben Daten ein, suchen in Adressen und erstellen Aufträge aller Art. Zu diesem Zweck ruft man verschiedene Oberflächen (Fenster) auf. Das geht auch eine Zeit lang gut bis
dann eine Konstellation auftritt, die beim Aufruf eines Fensters dann die Anwendung am Client einfriert. Ein erkennbarer Zusammenhang ist, daß ein Anwender im gleichen Programmteil arbeitet, den ein weiter aufrufen will.
Warum das nur manchmal passiert, erschliesst sich mir nicht. Hat es mit dem Aufruf der Fenster zu tun, mit dem Laden der Daten .... Ich habe keinen Schimmer.
Habe die Fenster bisher dynamisch erstellt , modal angezeigt und dann wieder freigegeben. Habe jetzt umgestellt und die Fenster schon bein Programmstart erzeugt. Problem besteht weiterhin.
Auf meinen PC's versuche ich das zu simulieren, habe es bisher aber nicht geschafft. Da läuft alles OK. Meine eigenen Rechner sind WIN 10 Professional PC's, die vom Kunden laufen noch mit XP, obwohl moderne Hardware.
Speicherproblem scheint ausgeschlossen da alle Clients und der Server >=2 GB haben. Ich vermute dass es mit dem Laden der Daten vom Server zu tun hat, wenn ich ein Fenster öffne und die Daten aus
Firebird lade und anzeige. Hat irgendjemand eine Idee oder braucht noch mehr Info ?
Werde die Frage auch noch im Forum bei Datenbanken einstellen.
Jede Idee ist hilfreich.
Lucky

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Anwendung friert beim Öffnen eines Fensters ein

Beitrag von mse »

Das hat vermutlich weniger mit Formularen sondern mit Transaktionen zu tun. Die 6 Anwender arbeiten doch sicher mit 6 verschiedenen Anwendungsinstanzen? Hast du dich um die "transaction isolation level" gekümmert?
https://www.ibphoenix.com/resources/doc ... to/doc_400
https://www.firebirdsql.org/pdfmanual/h ... tions.html
https://firebirdsql.org/file/documentat ... ments.html

luckylynx
Beiträge: 10
Registriert: So 25. Dez 2016, 13:07

Re: Anwendung friert beim Öffnen eines Fensters ein

Beitrag von luckylynx »

Hallo mse,
danke für die schnelle Antwort.
Du hast recht, die Transaktionen sind ein heikles Thema und die 'transaction isolation level' im Besonderen.
Im Programm gibt es ein Hauptfenster , von wo alle Unterfenster aufgerufen werden. Wie gesagt erst dynamisch jetzt statisch.
Jedes Fenster beinhaltet eine eigene Anwendung die wiederun ihrere eigene Transaktion startet. Der 'transaction isolation level' wird auf
'isc_tpb_read_committed ' gesetzt. da das die einzige Variante ist, wo mehrere Anwender parallel arbeiten können.
Sobald ich andere Einstellungen mache wie 'isc_tpb_read_committed,isc_tpb_rec_version,isc_tpb_wait ', kommen viele deadlock Meldungen
oder der Zugriff auf die DB ist für andere gesperrt. Es gibt auch 'try finally' oder 'try except' in den Aufrufen.
Ich denke es ist ein guter Ansatz die Transaktionen noch einmal anzugehen und sie vielleicht kürzer zu machen, d .h sie erst zu öffnen wenn gelesen oder geschrieben wird und sie dann sofort wieder schliessen.

Lucky

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6198
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Anwendung friert beim Öffnen eines Fensters ein

Beitrag von af0815 »

luckylynx hat geschrieben:Ich denke es ist ein guter Ansatz die Transaktionen noch einmal anzugehen und sie vielleicht kürzer zu machen, d .h sie erst zu öffnen wenn gelesen oder geschrieben wird und sie dann sofort wieder schliessen.

+1

Nicht nur das die Transaktion wirklich nur dann aktiv sein sollte wen unbedingt gebraucht, auch die Transaktion mit try..finally..end schützen, also entweder comitten oder verwerfen. Nicht das durch eine Exception die Transaktion hängen (offen) bleibt.

Es klingt böd, aber manchmal ist das Autocommit gar nicht so schlecht. (Ist jetzt in der TQuery unter options drinnen). Kann sein das man die noch in der Transaktion einstellen muss. Ich habe aktuell mit SQLDB zu wenig gemacht.

Andreas
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Antworten