Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 243043 (4479)

| Suchen
| Zurück zur Übersicht

Autor | Thema: DB und der Speicher
Gerd Telzerow
| Datum:21.03.02 21:57 (GTelzerow@T-Online.de) |
Hallo Profaner, Ich habe ein (Speicher) Problem mit der DB. In meinen Programm-Projekt hat der Anwender die Möglichkeit, Patienten zu verwalten und eine Komplette Abrechnung des Laufenden Monats vorzunehmen. Pro Patient sind insgesamt 408 Einträge in verschiedene DB möglich. Ich sichere die Daten je Patient im Dialog Speichern mit "DBClose" (das Blaue Fenster von WIN kennt jeder)der Anwender ist dann schon frustriert genug, oder? Ich kann ihn nicht zumuten das er dann auch noch z.B. 50 Patienten a 408 Einträge neu erstellen muss! Das Problem: Bei jeder Öffnung einer DB wird das Laufende Programm Größer, das Programm wird Langsamer und wenn die Ressourcen erschöpft sind "bitte vergrößern Sie die Auslagerungsdatei". Danke im voraus Gerd
Thomas Erny
| Datum:22.03.02 00:29 (thomas.erny@bluewin.ch) |
Hallo Gerd Das Problem ist mir bestens bekannt - aber leider kann ich Dir nicht helfen. Ich denke es ist ein Bug in dbOpen/dbClose, da die Funktinen Arbeitsspeicher beanspruchen, den sie nicht mehr freigeben. Es scheint allerdings nicht der einzige Bug zu sein. Wenn man eine geöffnete Tabelle mit vielen Datensätzen füllt, so wird das Programm immer langsamer und langsamer, wobei beim Speicher kein Verlust festzustellen ist. Ich hoffe stark, dass sich Roland darum kümmert - schliesslich sind diese dBase-Funktionen super praktisch. Thomas
Bernd
| Datum:22.03.02 08:48 (info@ebs-haase.de) |
Hi! Ich arbeite ausschließlich mit DB. Hierbei eist es sehr wichtig, für welche Programmiertechnik man sich entscheidet. Es ist wichtig zu wissen, daß erst beim DBClose die Datensätze in die DB geschrieben werden. Somit ist folgendes festzuhalten: Wenn ich eine "Einplatzanwendung" schreibe eröffne ich die DB am Progammanfang und schließe am Programmende (einfach nicht wahr).Sollten in diesem Programm viele Datensätze aufgebaut werden ( wie in Eurem Beispiel ), dann beansprucht das natürlich auch viel Speicher. Es sei denn, man schließt zwisschendurch die DB ( dies würde ich vorschlagen ). Das hat den Effekt, das maximal ein DS verloren geht, bei einem Absturz oder BLue Sscreen. Bei "Mehrplatzanwendungen" würde ich die DB eröffnen, Daten abarbeiten und wieder schließen. Dieses manche ich so, schon auf Hinblick der Multiuserfähigkeiten bei DBASE III DBs. Vielleicht hilft euch diese kleine Ausführung. Wenn Ihr weitere Fragen habt, könnt Ihr mich gerne anmailen. :-)) Bernd
Thomas Erny
| Datum:22.03.02 10:13 (thomas.erny@bluewin.ch) |
Hallo Ich denke, es handelt sich da wirklich um einen Bug. Das folgende kleine Beispiel mit der Beispieldatenbank von Profan7 zeigt es deutlich: Cls Declare Anzahl% WhileLoop 2000 Let Anzahl% = @dbOpen(#1,"C:\\PROGRAMME\\PROFAN70\ \\DEMO\\ADRESS.DBF") ' Pfad anpassen @dbUse(#1) Print "ADRESS.DBF hat",Anzahl%,"Datensätze!" @dbClose(#1) EndWhile WaitInput Für das 2000 mal öffnen und schliessen der Tabelle braucht das Programm ca. 30 MB Arbeitsspeicher, den es erst nach Programmende wieder freigibt. Mit dem modifizierten Beispiel kann man den Speicher auch gleich mit anzeigen: Decimals 0 Declare Anzahl%, MemStat# Def GlobalMemoryStatus(1) !"KERNEL32","GlobalMemoryStatus" Def Mbyte(1) Round(Div(&(1),$0100000),0) Cls WhileLoop 2000 Dim MemStat#,32 Long MemStat#,0=32 GlobalMemoryStatus(MemStat#) Let Anzahl% = @dbOpen(#1,"C:\\PROGRAMME\\PROFAN70\ \\DEMO\\ADRESS.DBF") ' Pfad anpassen @dbUse(#1) Print "ADRESS.DBF hat",Anzahl%,"Datensätze!",\ MByte(Long(MemStat#,12)), "MB Speicher frei" Dispose MemStat# @dbClose(#1) EndWhile WaitInput Gruss Thomas
Gerd Telzerow
| Datum:22.03.02 14:07 (GTelzerow@T-Online.de) |
Hallo Bernd, mit dem Umgang einer DB habe ich keine Probleme, das Problem ist Treffend von Thomas Erny dargestellt. Ich habe eine Lösung gefunden ist nicht Optimal aber es geht erstmal. Eine neue Datei erstellen z.B. DBSichern.exe '***************** Declare Datei$,Eintrag$ Proc NeuerPatient @dbAppendBlank() @dbPutMemo("DIAGNOSE")'Problem @dbPut("NAMEP",@Trim$(@ReadIni$("DBIII.INI","EINTRAG","A2"))) @dbPutRec(0) EndProc Let Datei$=@ReadIni$("DBIII.INI","EINTRAG","A0") Let Eintrag$@ReadIni$("DBIII.INI","EINTRAG","A1") @DBOpen(#1,Datei$) @dbUse(#1) Eintrag$ @dbClose(#1) End '*************** und im Laufendem-Programm das Programm mit Shell Aufrufen WRITEINI "DBIII.INI","EINTRAG","A0"="Algemei.dbf" WRITEINI "DBIII.INI","EINTRAG","A1"="NeuerPatient" WRITEINI "DBIII.INI","EINTRAG","A2"="Telzerow" und..... Shell "DBSichern " Gerd
Dirk
| Datum:10.04.02 16:50 (dige@gmx.de) |
Diese Speicherfresserei ist wirklich problematisch. Ich habe bei meiner Börsensoftware das gleiche Problem, die gedownloadeten 5.000 Kurse werden in entsprechende Tabellen geschrieben ... da gehen nach jedem Download 60MB!!! Speicher drauf. Bei mir hilft zZ. nur noch ein Neustart :-( Es wäre wirklich toll wenn das Problem mal gelöst werden könnte. Gibt es vielleicht irgend welche FreeWare dlls die den dBase Zugriff ermöglichen ? Gruß Dirk
Dirk
| Datum: 15.04.02 16:15 (dige@gmx.de) |
Hallo Gerd, habe aufgrund Deiner Super Idee!! auch alle dBase Zugriffe in ein externes Programm mit komprimierter Runtime ausgelagert. Die 95K mehr kann verschmerzen ;-) Funktioniert Prima und ist auch noch schneller, da man das Messagehandling abschalten kann... Gruß Dirk

| Zurück zur Übersicht