Seite 2 von 2

Verfasst: 12.11.2004 17:29
von Benubi
hallo liebe gemeinde,

ich möchte auch etwas dazu sagen, da ich mich mit dem Datei-Thema ebenfalls beschäftige... Fred hat bestimmt aus performance grüden die sache so gemacht, doch für alles gibt es abhilfe (dafür ist ein wenig projekt-werbung nötig :-) )...

Das "MemFile" (mein kleines projekt) prinzip ist einfach: alle File-Befehle von PB habe ich "neugeschrieben" so dass sie eine im Ram geladene Datei modifizieren kann. Ich habe hier ebenfalls die Befehle "MUseFile(*FileID)" eingebaut. (für die DLL-Version)
*FileID ist hierbei ein GLOBALER Zeiger, der von allen "Read/Write" befehlen genutzt wird... Wäre es nicht so müsste mein Programm zuerst den Zeiger jedesmal darauf Testen, ob er gültig ist. Gültig ist er nur wenn er 2 Bedinungen erfüllt. Man kann den *CurrentFile zeiger nur mit 0 oder einem gültigen zeiger initialisieren. Deshalb kann ich den read/write -befehel einfach abbrechen wenn FileID = 0 ist, und brauche nicht FileID 2-3 zu checken (+prozeduren-sprung zeit etc...)

Wenn ich also meine ReadWrite-Befehle jedesmal mit einer *FileID
ausstatten würde, müsste ich diese (vorsichtshalber) testen, wodurch performance verloren gehen würde, und alles 3-6x so lange dauert.

Nun kann ich dazu keinen weiteren Tipp geben, als selbst kleine 'Wrapper-Routinen' zu schreiben, sollte sich an der Parameter-Auswahl nichts ändern.


----
Beispiel: (ungetestet)

Code: Alles auswählen


Global UseByte.b

Procedure.l D_ReadLong(*FileID)
if UseByte = 1 : repeat : until UseByte = 0 : UseByte = 1 : endif
UseByte = 1
UseFile(*FileID)
result.l = Readlong()
UseByte = 0
procedurereturn result
EndProcedure

Procedure D_FileSeek(*FileID, pos.l)
if UseByte = 1 : repeat : until UseByte = 0 : UseByte = 1 : endif
UseByte = 1
UseFile(*FileID)
result.l = FileSeek(pos)
UseByte = 0
procedurereturn result
EndProcedure

Procedure.l D_Loc(*FileID)
if UseByte = 1 : repeat : until UseByte = 0 : UseByte = 1 : endif
UseByte = 1
UseFile(*FileID)
result.l = Loc()
UseByte = 0
procedurereturn result
EndProcedure

procedure ClearUseByte()
  UseByte=0
endprocedure
aber 100% sicher wird es wahrscheinlich auch nicht sein...
bei einem fehler sollte man dann dieses UseByte auch löschen, da sonst jeder weitere datei zugriffs-versuch in einer endlosschleife enden würde :freak:



edit: ein paar Verben eingefügt :oops: