Seite 2 von 2

Re: xb2.net Stresstest

Verfasst: Sa, 18. Feb 2012 16:01
von ramses
@Martin ich habe in der Anwendung etwa 20 Tool Funktionen sehr häufig verwendet. Diese rauszuschreiben resp. mit selbstgeschiebenen Funktionen zu ersetzen ist z.T. ein wenig aufwenig. Nur z.B. Filestr() was ist der bessere Weg? Memoread() FOpen()/FRead() Um sicher zu gehen das die selbstgeschiebenen Funktionen in allen Fällen korrekt funktionieren gehen sofort einige Tage oder Wochen drauf....... Sie müssen ja in ein Produktivsystem.....

Wenn ich als Test in der Loginfunktion filestr() durch memoread() ersetzte übersteht die Login Funktion den Stresstest.

Die Frage stellt sich jetzt: Ist Filestr() die einzige Kritische Funktion oder ist nun wirklich die Zeit gekommen und es besser die Tools mit selbstgeschriebenen Ersatzfunktionen zu ersetzten?

Dass Filestr() die Ursache dieses ganzen Problems ist hätte ich nie und nimmer gedacht! :shock: Danke für die Tips =D>

Viele Grüsse

carlo

Re: xb2.net Stresstest

Verfasst: Sa, 18. Feb 2012 20:46
von Martin Altmann
Moin Carlo,
ramses hat geschrieben:Dass Filestr() die Ursache dieses ganzen Problems ist hätte ich nie und nimmer gedacht!
dafür gibt es die Erfahrung bzw. das Bauchgefühl 8)
Und nein - ich würde mich nicht darauf verlassen, dass dies die einzige Funktion aus den Tools mit Problemen im Multithreading-Umfeld ist, ganz im Gegenteil!
Thema umschreiben:
Lass es so, wie es ist und schreibe peu à peu die aus den Tools genutzten Funktionen selber. Dann ein globales Suchen und Ersetzen der Funktionsnamen und schon stellst Du nach und nach um.
Alternativ kannst Du natürlich auch mit entsprechenden #translate-Direktiven arbeiten - macht aber in Deinem Fall wenig Sinn, da Du ja komplett von der eigentlich Funktion weg willst.

Viel Erfolg,
Martin

Re: xb2.net Stresstest

Verfasst: So, 19. Feb 2012 0:10
von brandelh
Hi,

was StrFile() angeht, schau dir mal meine Funktionen dazu an (die nutzen intern fopen() etc.)

http://www.xbaseforum.de/viewtopic.php?f=16&t=1811

Grundsätzlich kannst du für alle verwendeten Funktionen eine mit dem gleichen Namen und dem gleichen Verhalten schreiben,
dann brauchst du den Code nicht zu ändern. ICH MEINE dass eine gleichnamige Funktion aus der EXE immer vor
einer aus einer DLL geht, ohne dass es Fehler beim compilieren oder linken gibt. Einfach mal ausprobieren ;-)

PS: FALLS eine der Funktionen das Verhalten provoziert, ist selbstschreiben immer noch besser als auf Verbesserung zu hoffen 8)
OB es aber eine dieser ist bzw. die gelinkte DLL komplett, das musst du schon selbst ausprobieren.

Re: xb2.net Stresstest

Verfasst: So, 19. Feb 2012 9:58
von ramses
Hi
Danke für die Tips. Nach einigem Nachdenken habe ich mich jetzt entschlossen nur für die Webanwendung komplett auf die Tools zu verzichten und diese nicht mehr zur EXE zu linken. Ich denke es ist ein "No Go" die Tools mit den gewonnen Erkenntnissen/Problemen weiter zu verwenden. Auf dass Alaska was ändert warte ich sicher nicht........! (Leben die eigentlich noch??)

@Hubert, Es ist so eine Funktion aus der EXE ersetzt diejenige einer DLL. Die beiden erwähnten Funktionen stehen jetzt an erster Stelle in meinen XBTRepla.PRG

@Martin, nein ich mach jetzt "Hau Ruck" Tools komplett raus!



Viele Grüsse

Carlo

Re: xb2.net Stresstest

Verfasst: Mo, 20. Feb 2012 8:04
von brandelh
Speziell bei Str2Disk() oder set alternate to muss man natürlich im Hinterkopf haben, dass
die Dateinamen auf jeden Fall einmalig sind. Die sharen ja nicht ;-)

Re: xb2.net Stresstest

Verfasst: Mo, 20. Feb 2012 9:41
von ramses
@Hubert bei deiner Funktion FileStr() musst du noch die beiden Local Vars initialisieren cBuffer := "", nReadBytes := 0 anderfalls ergibt die Funktion bei einem File-Lesefehler in der Zeile return left(cBuffer,nReadBytes) einen Laufzeitfehler. Keine Angst es sind alles einmalige Files :wink:

Viele Grüsse

Carlo

Re: xb2.net Stresstest

Verfasst: Mo, 20. Feb 2012 10:54
von brandelh
Hi,

danke, habe ich bei File2Str() erledigt ;-)

Lokal hatte ich damit noch nie einen Lesefehler sonst wäre es mir aufgefallen ;-)

Re: xb2.net Stresstest

Verfasst: So, 04. Mär 2012 12:39
von ramses
@Hubert, ich habe mich jetzt lange mit dem Stresstest beschäftigt, viele Funktionen mussten ersetzt werden, sogar solche von xBase selbst, auch die Funktion fileStr() musste noch verändert werden, die Original Funktion liefert sonst bei Zugriff (Schreiben/Lesen) aus verschiedenen Threads auf selbe File, kuriose Ergebnisse.

Was meinst du zu den Anpassungen?

Viele Grüsse

Carlo

Code: Alles auswählen

// --------------------------------------------------------------------

function FileStr(cFile,nStartPos,nLen,nError, lExclusive)      // ..., @nError ) !!
   local nHandle, cBuffer := "", nReadBytes := 0,nSeekPos, i := 0

   DEFAULT nStartPos TO 1    // normalerweise will man das 1. Zeichen.
   DEFAULT nLen      TO 0    // 0 steht fr keine Begrenzung
   default lExclusive to .t. // Vorgabe EXCLUSIVES Open

   if nStartPos < 1
      nStartPos := 1
   endif

   nError  := 0              // 0 steht fr keinen Fehler
   do while (nHandle := FOpen(cFile, iif(lExclusive, FO_EXCLUSIVE,FO_SHARED)  ) ) < 0
         if ++i > 9 .or. !file(cFile)
            exit
         endif
         Sleep(20)
   enddo
   if nHandle = -1
      nError := FError()
   else
      if nLen=0
         nLen := FSize( nHandle )
      endif
      if nStartPos > 1
         nSeekPos := FSeek( nHandle, nStartPos-1 )
         if nSeekPos <> nStartPos-1
            nError := -2
         endif
      endif
      cBuffer    := space(nLen)
      nReadBytes := FRead( nHandle, @cBuffer, nLen)
      if nReadBytes < nLen    // Fehler oder Dateiende ?
         nError := FError()
      endif
   endif
   FClose(nHandle)

return left(cBuffer,nReadBytes)


Re: xb2.net Stresstest

Verfasst: So, 04. Mär 2012 16:48
von brandelh
Hi,

entscheident ist, dass es funktioniert ;-)

PS: ich benutze Textdateien nie shared, allerdings habe ich auch kein Programm, welches mit mehreren Threads gleichzeitig auf eine Textdatei zugreifen müsste.
Lesezugriffe mit einer SHARED READ ONLY sollten aber immer problemlos funktionieren.

Man sollte eventuell den SLEEP() in der Schleife mit einem Zufälligen Wert zwischen 5 und 20 füttern ...

Re: xb2.net Stresstest

Verfasst: So, 11. Mär 2012 14:44
von ramses
@Hubert, danke guter Tip habe ich noch gemacht.

@ALL die Obige Funktion FileStr() kann nicht als direkter Ersatz für XBTools verwendet werden wenn mehr als Parameter 1 (Filename) verwendet wird. Die Parameter 2+3 sind vertauscht, und nStartPos hat andere Funktion!!!!!