Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi BDE hängt! (https://www.delphipraxis.net/82015-bde-haengt.html)

smaug 6. Dez 2006 16:41

Datenbank: Paradox • Version: 5.11 • Zugriff über: BDE

BDE hängt!
 
Hallo,

ich verwende 3 Programme, die über BDE auf Datenbanken zugreifen.
Ein Server, der als Dienst läuft, eine Client-Oberfläche und ein C-Programm mit einer in Delphi geschriebenen DLL.
Das C-Programm wird vom Server mit CreateProcess gestartet.

Wenn alle drei zusammen laufen, hängt die BDE.
Die DLL kommt dabei als letztes, öffnet eine Tabelle, schreibt einige Sätze und schließt sie wieder. Alles ohne Fehler.
Das seltsame ist, dass das C-Programm bis zum Ende durchläuft, GetExitCodeProcess mir aber 128 zurückliefert. Beim nächsten Zugriff auf Tabellen frieren sowohl Server als auch Client ein. Genauer gesagt: TTable.open auf dem Server kehrt nicht zurück; das mit einer TQuery verbundene DBGrid wird nicht mehr gezeichnet.

In allen drei Programmen verwende ich dasselbe NetDir und jeweils ein eigenes PrivateDir. Der Client erzeugt allerdings auch LCK-Dateien im DB-Verzeichnis!?
Das ganze läuft auf Win200 Workstation. BDE Version 5.11. Der Benutzer hat Amdinrechte, der Dienst läuft unter System.

LOCAL SHARE steht auf true, damit ich die LCK-Dateien besser verfolgen kann. Das macht aber keinen Unterschied.

Ich hab' keine Ahnung mehr wo ich den Fehler noch suchen soll.

mkinzler 6. Dez 2006 17:56

Re: BDE hängt!
 
Was<macht ie Dll genau? Vielleicht erzeugt diese Locs die nicht mehr entfernt werden?

Bernhard Geyer 6. Dez 2006 20:29

Re: BDE hängt!
 
1, Um zu checken ob du nicht einfach Speicherlücken im Bereich DB-Komponenten hast häng mal FastMM4 rein

2, Von deinem geschilderten System von einem Client und Server zu reden ist etwas zu viel des guten. Wenn es wirklich Client/Server wäre, hättest Du den DB-Zugriff und die Kompos eh nur auf dem Server und eine passende Schnittstelle wie die anderen Komponenten mit dem Server kommunizieren.

3, Nur der obligatorische Satz: Schmeiß die BDE weg. Wie du merkst bekommt man (trotz der Betrachtung aller möglichen bekannten) Fehlerquellen immer wieder Probleme. Aber ich will nicht weiter ausholen. Probier erstmal Punkt 1 um zu sehen obs evtl. nur "triviale" Speicherlücken sind.

smaug 7. Dez 2006 11:11

Re: BDE hängt!
 
Die DLL wird mehrfach aufgerufen.
Beim ersten Mal wird PrivateDir und NetDir von Session gesetzt und eine Tabelle geöffnet, die von den anderen beiden Programmen nicht verwendet wird, aber im gleichen Verzeichnis liegt.
Bei jedem Aufruf wird ein Datensatz hinzugefügt oder geändert, die Tabelle bleibt dabei offen.
Beim letzten Aufruf wird die Tabelle geschlossen und freigegebn.
Ausser schreiben in eine Logdatei, die auch sauber geschlossen wird, macht die DLL nichts.

Ich werde die Programm von nun an Dienst und Oberfläche nennen, ok? Eine Schnittstelle für schreibenden Zugriff auf die Datenbanken ist übrigens vorhanden. Die Oberfläche öffnet nur TQuerys und TTable im Browse-Modus.

FastMM hab ich in uses eingebunden. Im C-Programm allerdings nicht, das ist nicht mit Borland kompiliert. Und nu?

smaug 7. Dez 2006 11:18

Re: BDE hängt!
 
Wenn die Oberfläche zu ist und die DLL somit sauber durchläuft, bleiben auch kein LCK-Dateien liegen.

Bernhard Geyer 7. Dez 2006 12:41

Re: BDE hängt!
 
Zitat:

Zitat von smaug
FastMM hab ich in uses eingebunden. Im C-Programm allerdings nicht, das ist nicht mit Borland kompiliert. Und nu?

Muss noch mit Debug-Infos im FullDebugMode arbeiten damit auch FastMM meckert.

smaug 7. Dez 2006 14:45

Re: BDE hängt!
 
Das ist interessant, mit FastMM bleibt jetzt schon das C-Programm hängen, die BDE bleibt aber verschont, sofern die Oberfläche keine Query offen hat.
Hat die Oberfläche eine Query offen, kommt das C-Programm weiterhin mit 128 zurück und es wird keine Logdatei erstellt.

Im MemoryManager_Event.log findet sich
Zitat:

5 - 12 bytes: TIniFile x 1
13 - 20 bytes: TObjectList x 3, Unknown x 3
21 - 28 bytes: TCriticalSection x 1
29 - 36 bytes: TWinHelpViewer x 1
37 - 44 bytes: String x 1
45 - 60 bytes: THelpManager x 1
Das IniFile habe ich definitiv freigegeben, der Rest ist mir vollkommen unbekannt ...?

Bernhard Geyer 7. Dez 2006 15:06

Re: BDE hängt!
 
Hast Du TWinHelpViewer und THelpManager kannst Du vergessen. Evtl. auch noch die Units von Helpware im Einsatz. Fehler ist dort zu suchen bzw. in WinHelpViewer.pas und HelpIntfs.pas

Pack noch Debug-DCU's dazu und schau dir mal die Log-Dateien an. Dort ist der Aufrufstack für deine Speicherlücken drin.

smaug 7. Dez 2006 15:59

Re: BDE hängt!
 
Mit den Helpdingern hab ich nix zu schaffen:

Zitat:

[HelpIntfs.pas][HelpIntfs][THelpManager.Create][293]
[FastMM4.pas][FastMM4][DebugGetMem][6000]
[HelpIntfs.pas][HelpIntfs][GetHelpSystem][274]
[system.pas][System][@NewAnsiString][11530]
[Forms.pas][Forms][TApplication.ValidateHelpSystem][7109]

[WinHelpViewer.pas][WinHelpViewer][initialization][655]
[system.pas][System][InitUnits][10548]
[system.pas][System][@StartLib][10710]
Dafür hab ich die Critical Section gefunden und elimiert. Ausserdem hatte sich doch noch ein IniFile-Object in einer anderen Unit versteckt. Hat leider nichts gebracht.

Die eingebundenen Units
uses Sysutils, IniFiles, Classes, DBTables, FileCtrl;

smaug 8. Dez 2006 14:16

idap32.dbiExt
 
Ich hab das Ganze mal ausführlich debugt. Beim Beenden der DLL gibt's eine Access Violation.

Das letzte, was ich im Quellcode zu sehen kriege, ist DLLDetachCallback in DBTables. Im Assembler komm ich dann noch bis call idapi32.dbiEXT. Irgendwo da drinnen kracht's dann.

Bernhard Geyer 8. Dez 2006 14:20

Re: BDE hängt!
 
Ergänz mal eine gesonderte Close-Funktion in deiner DLL. Hatte auch mal den Probleme wenn die DB-Verbindung erst beim finalization der Units bzw. beim Destruktor der Units geschlossen wurde. Hier wars aber da in meinem Fall die Screen-Instanz nicht mehr vorhanden war.

smaug 8. Dez 2006 15:02

Re: BDE hängt!
 
Die TTable hab ich natürlich geschlossen. (Wenn sie offen bleibt macht's aber auch keinen Unterschied.)
Oder meinst du eine andere Close-Funktion?

Bernhard Geyer 8. Dez 2006 17:21

Re: BDE hängt!
 
Zitat:

Zitat von smaug
Die TTable hab ich natürlich geschlossen. (Wenn sie offen bleibt macht's aber auch keinen Unterschied.)
Oder meinst du eine andere Close-Funktion?

Auch TDatabase geschlossen?

smaug 11. Dez 2006 08:19

Re: BDE hängt!
 
TDatabase verwende ich gar nicht.
Hab's aber mal ausprobiert und eine Instanz erzeugt, macht (ja genau) keinen Unterschied.

Aber nochmal die Frage nach den LCK-Dateine im DB-Verzeichnis. Ist das normal, dass hier auch PARADOX.LCK und PARADOX.LCK liegen, zusätzlich zu denen im PrivateDir?

Bernhard Geyer 11. Dez 2006 08:32

Re: BDE hängt!
 
Zitat:

Zitat von smaug
TDatabase verwende ich gar nicht.
Hab's aber mal ausprobiert und eine Instanz erzeugt, macht (ja genau) keinen Unterschied.

Auch alle TTable-Instanzen darauf umgestellt und dann rechzeitig TDatabase-Verbindung geschlossen.

hoika 11. Dez 2006 09:23

Re: BDE hängt!
 
Hallo,

ich würde das DB-Verzeichnis mal auf einen anderen Rechner legen,
und in der Systemsteuerung(Computerverwaltung, Freigaben)
mir die geöffneten Dateien ansehen.

Lokal geht es auch über SysInternals (Processviewer)


Heiko

smaug 11. Dez 2006 09:56

Re: BDE hängt!
 
Wie kann ich TTable auf TDatabase umstellen? Die gleichnamige Eigenschaft ist doch readonly.
Und was heisst rechtzeitig?

hoika 11. Dez 2006 10:01

Re: BDE hängt!
 
Hallo

TDataBase.Directory auf dein Verzeichnis setzen oder AliasName auf den BDE-Alias
und bei allen TTable DataBaseName auf TDataBase.DataBaseName

Ich denke aber, bei Paradox-Tabellen nützt das nicht viel,
die Tabellen werden bei einem TDataBase.Connected=False (Close, oder was immer)
nicht geschlossen.
Es käme auf einen Test an.

Das kannst du aber auch über mein obiges Posting machen.


Heiko

smaug 12. Dez 2006 15:07

Re: BDE hängt!
 
TDatabase war über DatabaseName bereits richtig verknüpft und auch geschlossen.

Die LCK-Dateien kommen mir aber immer noch komisch vor.

(Wenn das Problem überhaupt hier liegt.)
In OnShow des Hautpfensters, das selber keine BDE-Komponenten hat, setze ich Session.PrivateDir. PDOXUSRS.LCK wird auch sofort dort angelegt. Soweit OK. Ausserdem wird dort TDatabase instanziiert.

Delphi-Quellcode:
Session.NetFileDir := path+'NET';
Session.PrivateDir := ExtractFilePath(ParamStr(0))+'CLIENT';

globalDatabase := TDatabase.Create(nil);
with globalDatabase do begin
  databaseName := 'MyDB';
  DriverName  := 'STANDARD';
  globalDatabase.Params.Add('PATH='+path);
  connected := true;
end;
Erst bei Bedarf werden Formulare kreiert.
Delphi-Quellcode:
object MyTab: TTable
   DatabaseName = 'MyDB'
   TableName = 'DATA.DB'
   object DataField1: TStringField
      FieldName = 'Field1'
      Size = 6
   end
end
In OnShow eines anderen Formulars wird dann eine TTable geöffnet. Jetzt erscheint auch eine PDOXUSRS.LCK im DB-Verzeichnis.

Soll das so sein??

hoika 12. Dez 2006 16:59

Re: BDE hängt!
 
Ja,

damit Paradox feststellen kann, ob eine Tabelle exclusiv geöffnet werden kann,
wird auch das blosse Öffnen einer Tabelle protokolliert (in ebend jeder LCK-Datei).


Heiko


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:07 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