Low Level File I/O --> Interne Datenstrukturen zerstört

Konzeptionelles, Technisches, Termine, Fragen zum Hersteller usw.

Moderator: Moderatoren

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

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.
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Low Level File I/O --> Interne Datenstrukturen zerstört

Beitrag von AUGE_OHR »

hi Carlo,
ramses hat geschrieben: Mo, 31. Jan 2022 20:42 ich habe eine neue Funktion erstellt. Diese nutzt intensiv die Low-Level File Funktionen FOpen() FRead() FWrite() FSeek() FClose() in mehreren unterschiedlichen Threads im selben Programm auf lokale Dateien auf einem Server 2019.
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)
aus den Threads wird es so aufgerufen

Code: Alles auswählen

	PostAppEvent(xbeE_WriteMe,cText,,oWriteThread)
das müsste auch klappen wenn 2 x Thread "gleichzeitig" ein PostAppEvent(xbeE_WriteMe) abgeschickt haben die "hintereinander" in der "Warteschleife" landen
gruss by OHR
Jimmy
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

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.
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Low Level File I/O --> Interne Datenstrukturen zerstört

Beitrag von AUGE_OHR »

hi Carlo,
ramses hat geschrieben: So, 06. Feb 2022 12:14Einige andere Thread lesen die Datei jeweils (öffnen/Lesen/Schliessen).
auch das würde ich an "einen" Thread senden
ramses hat geschrieben: So, 06. Feb 2022 12:14Erst das Schliessen der Datei nach dem Schreiben brachte die Probleme aber NUR DANN wenn die gleichzeitig die anderen lesenden Thread's aktiv waren.
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
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

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.
Valar Morghulis

Gruss Carlo
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

Geht auch nicht.
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Low Level File I/O --> Interne Datenstrukturen zerstört

Beitrag von AUGE_OHR »

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" :!:

Code: Alles auswählen

#define xbeE_WriteMe       xbeP_User + 1
#define xbeE_ReadMe        xbeP_User + 2
#define xbeE_Ready2Read    xbeP_User + 3
dazu "schicken" die Threads per

Code: Alles auswählen

   PostAppEvent( xbeE_xxx , ,, oReadWrite)
einen xbeP_User an deine CLASS oReadWrite

---

wenn ein Thread "schreiben" will sendet er

Code: Alles auswählen

   PostAppEvent( xbeE_WriteMe , cText,, oReadWrite)
die CLASS oReadWrite "reagiert" nun auf den User-Event

Code: Alles auswählen

   DO CASE
      CASE nEvent = xbeE_WriteMe
            cText := mp1
            oReturn := mp2             
            AADD(aArray,{cText,oReturn})
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

Code: Alles auswählen

   PostAppEvent( xbeE_ReadMe , blabla, oSelfThread, oReadWrite)
was der "Server" so empfängt

Code: Alles auswählen

      CASE nEvent = xbeE_ReadMe
         xblabla := mp1
         oReturn := mp2 
         AADD(aArray,{"Return to",oReturn])
         xResult := DoReadAktion(xblabla)
wenn das Element an der Reihe ist und fertig ist "sende" ich

Code: Alles auswählen

   // sende an entsprechenden Thread
   oReturn := aArray[1][2]
   PostAppEvent(xbeE_Ready2Read,xResult,,oReturn)
was der entsprechende Thread so empfängt

Code: Alles auswählen

      CASE nEvent = xbeE_Ready2Read
         cText := mp1 
bei der ganzen Aktion habe ich nur 1 x Handle von FCreate() / FOpen() der mit der CLASS arbeitet :!:
gruss by OHR
Jimmy
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

Hallo Jimmy

postappevent() geht zwischen reinen Arbeits Threads nicht weil diese ja keine XBPParts sind/haben.
Valar Morghulis

Gruss Carlo
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

Hallo


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
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Low Level File I/O --> Interne Datenstrukturen zerstört

Beitrag von Wolfgang Ciriack »

Mach uns schlauer, woran lag es ? Lösung ? :D
Viele Grüße
Wolfgang
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

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.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Low Level File I/O --> Interne Datenstrukturen zerstört

Beitrag von Jan »

... so simpel. Da muß man erst mal drauf kommen.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Lewi
1000 working lines a day
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

Beitrag von Lewi »

Wie soll der Wert einer Variablen zerschossen werden können, wenn es nur eine Zuweisung gibt?
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

Lewi hat geschrieben: Mo, 07. Feb 2022 11:41 Wie soll der Wert einer Variablen zerschossen werden können, wenn es nur eine Zuweisung gibt?
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
Benutzeravatar
Herbert
Der Entwickler von "Deep Thought"
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

Beitrag von Herbert »

xbase at its best...
Aber gut zu wissen, dass fclose immer korrekt erfolgen muss.
Grüsse Herbert
Immer in Bewegung...
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

Herbert hat geschrieben: Mo, 07. Feb 2022 12:34 xbase at its best...
Aber gut zu wissen, dass fclose immer korrekt erfolgen muss.
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
Benutzeravatar
Lewi
1000 working lines a day
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

Beitrag von Lewi »

Hallo Ramses,
btw: wie sieht dein fOpen()-Befehl im Daten-Schreibe-Thread aus?
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

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

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


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.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Lewi
1000 working lines a day
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

Beitrag von Lewi »

Dazu noch eine ergänzende Frage: Wird deine Lese-Schreib-Funktion von einer Single-Station aufgrufen oder im Multi-User-Umfeld?
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

Lewi hat geschrieben: Mo, 07. Feb 2022 20:42 Dazu noch eine ergänzende Frage: Wird deine Lese-Schreib-Funktion von einer Single-Station aufgrufen oder im Multi-User-Umfeld?
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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Low Level File I/O --> Interne Datenstrukturen zerstört

Beitrag von AUGE_OHR »

hi Carlo,
ramses hat geschrieben: Mo, 07. Feb 2022 6:27 postappevent() geht zwischen reinen Arbeits Threads nicht weil diese ja keine XBPParts sind/haben.
ein Thread ist ein Object und man braucht nur ein

Code: Alles auswählen

nEvent := APPEVENT( @mp1, @mp2, @oXbp )
aber da du das Problem gelöst hast brauchst du keine andere Lösung.
gruss by OHR
Jimmy
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

Hallo Jimmy
AUGE_OHR hat geschrieben: Di, 08. Feb 2022 5:28 ein Thread ist ein Object und man braucht nur ein

Code: Alles auswählen

nEvent := APPEVENT( @mp1, @mp2, @oXbp )
Nein 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.
Valar Morghulis

Gruss Carlo
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Low Level File I/O --> Interne Datenstrukturen zerstört

Beitrag von AUGE_OHR »

hi Carlo,
ramses hat geschrieben: Di, 08. Feb 2022 5:47 Wenn du versuchst ein AppEvent() an ein einfaches Threadobjekt zu senden
ich sende ein PostAppEvemt an ein Object mit dem Thread und da funktioniert.
"wie" hast du das Thread-Object zugeordnet ?
gruss by OHR
Jimmy
ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2513
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

Beitrag von ramses »

Das Thread-Objekt selbst hat keine Event-Queue.
Valar Morghulis

Gruss Carlo
Benutzeravatar
Lewi
1000 working lines a day
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

Beitrag von Lewi »

ramses hat geschrieben: Mo, 07. Feb 2022 22:32
Lewi hat geschrieben: Mo, 07. Feb 2022 20:42 Dazu noch eine ergänzende Frage: Wird deine Lese-Schreib-Funktion von einer Single-Station aufgrufen oder im Multi-User-Umfeld?
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?
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.

Gruß, Olaf
Antworten