Low Level File I/O --> Interne Datenstrukturen zerstört
Moderator: Moderatoren
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Hallo zusammen
spannende Darstellungen die recht plausibel klingen. Natürlich wäre es schön wenn es mit den Low-Level Funktionen klappen würde....
Meine Priorität ist es inzwischen das Programm möglichst schnell mit den neuen Anforderungen zum laufen zu bringen egal wie. Durch einiges Optimieren an der Organisation läuft es nun auch mit der DBF Datei einiges schneller und dies jetzt ohne NTX Datei. Leider müssen die Binären Daten zum Speichern in der DBF in einen Hex-String der doppelt so lang wird konvertiert werden.....
SQL kommt aus verschiedenen Gründen nicht in Betracht, hauptsächlich weil die Original-Daten Monats-Weise in Dateien abgelegt werden müssen.
Auch die Idee von Lewi, eine andere Spache zu verwenden habe ich vor einiger Zeit gründlich Studiert und als für mich als unpraktikabel beurteilt.
spannende Darstellungen die recht plausibel klingen. Natürlich wäre es schön wenn es mit den Low-Level Funktionen klappen würde....
Meine Priorität ist es inzwischen das Programm möglichst schnell mit den neuen Anforderungen zum laufen zu bringen egal wie. Durch einiges Optimieren an der Organisation läuft es nun auch mit der DBF Datei einiges schneller und dies jetzt ohne NTX Datei. Leider müssen die Binären Daten zum Speichern in der DBF in einen Hex-String der doppelt so lang wird konvertiert werden.....
SQL kommt aus verschiedenen Gründen nicht in Betracht, hauptsächlich weil die Original-Daten Monats-Weise in Dateien abgelegt werden müssen.
Auch die Idee von Lewi, eine andere Spache zu verwenden habe ich vor einiger Zeit gründlich Studiert und als für mich als unpraktikabel beurteilt.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
hi Carlo,
aus den Threads wird es so aufgerufen
das müsste auch klappen wenn 2 x Thread "gleichzeitig" ein PostAppEvent(xbeE_WriteMe) abgeschickt haben die "hintereinander" in der "Warteschleife" landen
wie wäre es wenn die Thread nicht "direkt" schreiben sondern es an einen "Schreib-Thread" senden
Code: Alles auswählen
#define xbeE_WriteMe xbeP_User + 1
DO WHILE .NOT. lExit
nEvent := APPEVENT( @mp1, @mp2, @oXbp )
DO CASE
CASE nEvent = xbeE_WriteMe
cText := mp1
DoWriteNow(cText)
Code: Alles auswählen
PostAppEvent(xbeE_WriteMe,cText,,oWriteThread)
gruss by OHR
Jimmy
Jimmy
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Hallo Jimmy
genau so war es Aufgebaut nur 1 Thread (Thead1) hat die Datei (R/W) geöffnet und als EINZIGER in die Datei geschrieben.
Einige andere Thread lesen die Datei jeweils (öffnen/Lesen/Schliessen).
Das hat alles solange einwandfrei Funktioniert solange Thread1 die Datei nach dem Schreiben NICHT geschlossen hat.
Erst das Schliessen der Datei nach dem Schreiben brachte die Probleme aber NUR DANN wenn die gleichzeitig die anderen lesenden Thread's aktiv waren.
genau so war es Aufgebaut nur 1 Thread (Thead1) hat die Datei (R/W) geöffnet und als EINZIGER in die Datei geschrieben.
Einige andere Thread lesen die Datei jeweils (öffnen/Lesen/Schliessen).
Das hat alles solange einwandfrei Funktioniert solange Thread1 die Datei nach dem Schreiben NICHT geschlossen hat.
Erst das Schliessen der Datei nach dem Schreiben brachte die Probleme aber NUR DANN wenn die gleichzeitig die anderen lesenden Thread's aktiv waren.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
hi Carlo,
das ganze Event gesteuert wobei der Rückgabe Wert zu prüfen ist "ob" der schon "gefüllt" wurde
auch das würde ich an "einen" Thread senden
deshalb ja auch eine CLASS die sich um "lesen" UND "schreiben" kümmert und die Datei nur 1 x öffnet.
das ganze Event gesteuert wobei der Rückgabe Wert zu prüfen ist "ob" der schon "gefüllt" wurde
gruss by OHR
Jimmy
Jimmy
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Hallo Jimmy
Es gibt keine Events aber das wäre eine Idee, das lesen und Schreiben in die Dateien nur durch einen Thread und eine Sync Methode auszuführen.
Überlege mir diesen Versuch noch auszuführen.
Es gibt keine Events aber das wäre eine Idee, das lesen und Schreiben in die Dateien nur durch einen Thread und eine Sync Methode auszuführen.
Überlege mir diesen Versuch noch auszuführen.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
hi Carlos,
du hast mich wohl falsch verstanden. ich will ja NICHT mit Sync oder Signal() arbeiten.
du hast deine Threads und die sollen das lesen oder schreiben in der Datei "anfordern"
dazu "schicken" die Threads per
einen xbeP_User an deine CLASS oReadWrite
---
wenn ein Thread "schreiben" will sendet er
die CLASS oReadWrite "reagiert" nun auf den User-Event
zum schreiben hängt er den TEXT (mp1) an ein ARRAY.
"abgearbeitet" wird nun immer das 1st Element und dann "gelöscht" wenn FWRITE() ausgeführt wurde.
bei "read" muss ich auf ein Ergebniss "warten" bis die Abfrage "an der Reihe" ist
im Thread "sende" ich zum lesen
was der "Server" so empfängt
wenn das Element an der Reihe ist und fertig ist "sende" ich
was der entsprechende Thread so empfängt
bei der ganzen Aktion habe ich nur 1 x Handle von FCreate() / FOpen() der mit der CLASS arbeitet
du hast mich wohl falsch verstanden. ich will ja NICHT mit Sync oder Signal() arbeiten.
du hast deine Threads und die sollen das lesen oder schreiben in der Datei "anfordern"
Code: Alles auswählen
#define xbeE_WriteMe xbeP_User + 1
#define xbeE_ReadMe xbeP_User + 2
#define xbeE_Ready2Read xbeP_User + 3
Code: Alles auswählen
PostAppEvent( xbeE_xxx , ,, oReadWrite)
---
wenn ein Thread "schreiben" will sendet er
Code: Alles auswählen
PostAppEvent( xbeE_WriteMe , cText,, oReadWrite)
Code: Alles auswählen
DO CASE
CASE nEvent = xbeE_WriteMe
cText := mp1
oReturn := mp2
AADD(aArray,{cText,oReturn})
"abgearbeitet" wird nun immer das 1st Element und dann "gelöscht" wenn FWRITE() ausgeführt wurde.
bei "read" muss ich auf ein Ergebniss "warten" bis die Abfrage "an der Reihe" ist
im Thread "sende" ich zum lesen
Code: Alles auswählen
PostAppEvent( xbeE_ReadMe , blabla, oSelfThread, oReadWrite)
Code: Alles auswählen
CASE nEvent = xbeE_ReadMe
xblabla := mp1
oReturn := mp2
AADD(aArray,{"Return to",oReturn])
xResult := DoReadAktion(xblabla)
Code: Alles auswählen
// sende an entsprechenden Thread
oReturn := aArray[1][2]
PostAppEvent(xbeE_Ready2Read,xResult,,oReturn)
Code: Alles auswählen
CASE nEvent = xbeE_Ready2Read
cText := mp1
gruss by OHR
Jimmy
Jimmy
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Hallo Jimmy
postappevent() geht zwischen reinen Arbeits Threads nicht weil diese ja keine XBPParts sind/haben.
postappevent() geht zwischen reinen Arbeits Threads nicht weil diese ja keine XBPParts sind/haben.
Valar Morghulis
Gruss Carlo
Gruss Carlo
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Hallo
jetzt läufts, so wie am Anfang geplant ohne Sync Methoden usw. mit den Xbase++ fxxxx() Funktionen einwandfrei. Problem gelöst.
jetzt läufts, so wie am Anfang geplant ohne Sync Methoden usw. mit den Xbase++ fxxxx() Funktionen einwandfrei. Problem gelöst.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Wolfgang Ciriack
- Der Entwickler von "Deep Thought"
- Beiträge: 2950
- Registriert: Sa, 24. Sep 2005 9:37
- Wohnort: Berlin
- Hat sich bedankt: 14 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Mach uns schlauer, woran lag es ? Lösung ?
Viele Grüße
Wolfgang
Wolfgang
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Hallo Wolfgang
Entschuldigung. Das habe ich doch glatt vergessen.
In einem Forum habe ich den Hinweis gefunden dass der Aufruf von fclose() mit ungültigem Handle unter bestimmten Voraussetzungen zu zerschossenem Speicher und unvorhersehbaren Ereignissen führen kann.
Genau das war es. Eine einfache Abfrage if nHandle > 0 vor fClose(nHandle) hat das Problem beseitigt.
Entschuldigung. Das habe ich doch glatt vergessen.
In einem Forum habe ich den Hinweis gefunden dass der Aufruf von fclose() mit ungültigem Handle unter bestimmten Voraussetzungen zu zerschossenem Speicher und unvorhersehbaren Ereignissen führen kann.
Genau das war es. Eine einfache Abfrage if nHandle > 0 vor fClose(nHandle) hat das Problem beseitigt.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Jan
- Marvin
- Beiträge: 14662
- Registriert: Fr, 23. Sep 2005 18:23
- Wohnort: 49328 Melle
- Hat sich bedankt: 21 Mal
- Danksagung erhalten: 88 Mal
- Kontaktdaten:
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
... so simpel. Da muß man erst mal drauf kommen.
Jan
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Wie soll der Wert einer Variablen zerschossen werden können, wenn es nur eine Zuweisung gibt?
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Ich sag immer: Die Wege des Windows sind unergründlich.......
Anscheinend zerschiesst Windows bei einem ungültigen fclose() oder doppeltem Aufruf z.T. den Speicher der APP.
Ich habe es nun überarbeitet und nach jedem fclose() auch die Handle Variable auf 0 gesetzt so habe ich sichergestellt dass kein fclose() mit 0 oder doppelt aufgerufen wird.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Herbert
- Der Entwickler von "Deep Thought"
- Beiträge: 1991
- Registriert: Do, 14. Aug 2008 0:22
- Wohnort: Gmunden am Traunsee, Österreich
- Danksagung erhalten: 3 Mal
- Kontaktdaten:
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
xbase at its best...
Aber gut zu wissen, dass fclose immer korrekt erfolgen muss.
Aber gut zu wissen, dass fclose immer korrekt erfolgen muss.
Grüsse Herbert
Immer in Bewegung...
Immer in Bewegung...
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Den Hinweis habe ich in einem C Forum gefunden, das Problem ist nicht mal xbase spezifisch.
Ausser echt blöd gelaufen fällt mir dazu nichts mehr ein ..... TagE habe ich mich damit rumgeqält!
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Hallo Ramses,
btw: wie sieht dein fOpen()-Befehl im Daten-Schreibe-Thread aus?
btw: wie sieht dein fOpen()-Befehl im Daten-Schreibe-Thread aus?
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Hallo Lewi
ich nutze eine Klasse für diese Datenfiles für alle Aufgaben Erstellen, Lesen und Schreiben ein bestehenden File wird so geöffnet
Es gab im Code aber tatsächlich im Schreiber die Möglichkeit dass zwei Mal fClose() mit der gleichen Handle Nummer ausgeführt wurde. Deshalb ist es ja auch gelaufen ohne schliessen der "Schreibenden" Datei, wie ich jetzt weiss.
Ich kann die Anpassung rausnehmen dann ist auch der Fehler sofort wieder da.
ich nutze eine Klasse für diese Datenfiles für alle Aufgaben Erstellen, Lesen und Schreiben ein bestehenden File wird so geöffnet
Code: Alles auswählen
nTry := 10
do while nTry > 0
::nHandle := fopen( ::cDataPath + ::cAktFile, iif(::lOpenReadOnly, FO_READ + FO_DENYNONE , FO_READWRITE + FO_DENYNONE ) )
if ::nHandle > 0
exit
endif
nTry --
sleep(10)
enddo
if ::geterror(2) // Fehler und Angaben ins Logfile schreiben und FehlerFlag und Text setzten dann Methode verlassen
ret_val := .f.
exit
endif
Ich kann die Anpassung rausnehmen dann ist auch der Fehler sofort wieder da.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Dazu noch eine ergänzende Frage: Wird deine Lese-Schreib-Funktion von einer Single-Station aufgrufen oder im Multi-User-Umfeld?
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Die Dateien werden nur von einem Programm aber mit mehreren Threads gleichzeitig benutzt.
Zum Entwickeln und Testen habe ich ein Server 2019 und ein Standard Windows 10, eine Ram-Disk und auch ein Netzwerklaufwerk verwendet.
Was beschäftigt oder stört dich an der Sache?
Valar Morghulis
Gruss Carlo
Gruss Carlo
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
hi Carlo,
aber da du das Problem gelöst hast brauchst du keine andere Lösung.
ein Thread ist ein Object und man braucht nur ein
Code: Alles auswählen
nEvent := APPEVENT( @mp1, @mp2, @oXbp )
gruss by OHR
Jimmy
Jimmy
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Hallo Jimmy
als Empfänger benötigts du zwingend ein XBPPart z.B. ein SLE.
Wenn du versuchst ein AppEvent() an ein einfaches Threadobjekt zu senden
dann bekommst du die Fehlermeldung: Base2266 Receiver of message is not an object.
Nein Jimmy,AUGE_OHR hat geschrieben: ↑Di, 08. Feb 2022 5:28 ein Thread ist ein Object und man braucht nur einCode: Alles auswählen
nEvent := APPEVENT( @mp1, @mp2, @oXbp )
als Empfänger benötigts du zwingend ein XBPPart z.B. ein SLE.
Wenn du versuchst ein AppEvent() an ein einfaches Threadobjekt zu senden
dann bekommst du die Fehlermeldung: Base2266 Receiver of message is not an object.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- AUGE_OHR
- Marvin
- Beiträge: 12913
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
hi Carlo,
"wie" hast du das Thread-Object zugeordnet ?
ich sende ein PostAppEvemt an ein Object mit dem Thread und da funktioniert.
"wie" hast du das Thread-Object zugeordnet ?
gruss by OHR
Jimmy
Jimmy
- Lewi
- 1000 working lines a day
- Beiträge: 830
- Registriert: Di, 07. Feb 2006 14:10
- Wohnort: Hamburg
- Danksagung erhalten: 2 Mal
Re: Low Level File I/O --> Interne Datenstrukturen zerstört
Ich bin aktuell sehr bussy. Ich will ergründen, warum das FileHandle auf 0 gesetzt werden könnte. Da ich hauptsächlich im PHP-Umfeld agiere und mir dort auftretende Probleme mit Text-Logging im Multi-User, Muli-Prozess-Umgebungen bekannt sind, wollte ich aus dieser Perspektive auf Deinen Code schauen.ramses hat geschrieben: ↑Mo, 07. Feb 2022 22:32Die Dateien werden nur von einem Programm aber mit mehreren Threads gleichzeitig benutzt.
Zum Entwickeln und Testen habe ich ein Server 2019 und ein Standard Windows 10, eine Ram-Disk und auch ein Netzwerklaufwerk verwendet.
Was beschäftigt oder stört dich an der Sache?
Gruß, Olaf