Toon posts:

[Visual Basic] Rich Tekst box doet vreemd

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een eigen webservertje. (Nog steeds :)

Ik had het aan de praat maar het was verschrikkelijk langzaam. Het probleem zat m in het openen van de files en dan opsturen naar de client. Het openen ging slow. Ik weet ook niet hoe je kunt bufferen trouwens met VB om sneller files in te lezen maar goed.

Na wat zoeken op Internet vond ik wat code van iemand die ik great simpel en effectief vond namelijk de data eerst inlezen in een Rich Tekst Boxje en dan pas naar de client sturen. Dit ging best fijn.
code:
1
File.LoadFile Trim$(Webroot) & Trim$(file_name)

Niks aan de hand op mn werk waar ik het gebruikte op een windows 95 machine. Code deed het prima. Tot ik thuis kwam en er verder aan wilde werken maar dan op win2k. Nu plotseling werd mn data corrupt. Als ik eerst een Len(bronfile) doe en daarna een Len(Rich tekst box) dan is er ook dikke overhead in 1 keer ! Een plaatje van 17Kb wordt plots 173 bytes groter.

Op mn werk is dat niet, daar heb ik het vandaag ook eens getest en Len(Bronfile), Len(Rich Tekst box) is daar gelijk aan elkaar..

Iemand enig idee waarom dit nu misgaat ? Ik vind het best wel balen want het werkte leuk met kleine files tot 2 MB.

Verwijderd

Windows95 heeft waarschijnlijk nog een oude RTF-control (versie 2.0?) en Windows2000 heeft een nieuwere (3.0?)...
De overhead zal waarschijnlijk ontstaan door de extra informatie in de rtf-header, die blijkbaar in het nieuwe RTF-control erbij gezet wordt.

Helaas dus geen oplossing. Wellicht is het verstandiger (IMHO) om te kijken waarom het in de oude situatie (bestanden direct van schijf lezen) zo traag ging. De tussenstap met de RTF-box vind ik niet echt elegant...

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Kan je die files niet rechtstreeks uitlezen? Opzich is zo'n rich-text box toch een beetje te veel van het goede qua performance lijkt me....

Verwijderd

Topicstarter
Bedankt voor de tips. Die versies ga ik nog even controleren maar ik weet nog niet hoe dat werkt. Vermoedelijk moet ik even naar de filegrootte en datum zien van de .ocx files. Dat zal ik nog doen.

De rich tekst box was een enorme verbetering op de performance. Mn oude code was heel simpel dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
    handle = FreeFile
    byte$ = " "
    file$ = ""
    lg = FileLen(Trim$(Webroot) & trim$(open_this_file))
    Open Trim$(Webroot) & trim$(open_this_file) For Binary _
    as handle
    For x = 1 To lg
    Get #handle, , byte$
    file$ = file$ + byte$
     Next
     Close handle
     Send_to_Client(file$)

Zoals jullie zien hele simpele code (ik ben dan ook nog maar net paar dagen bezig met VB trouwens). Anyway deze code is damned slow.. Bij laden van kleine plaatjes dan zie je de page slow opbouwen en als je een file van 1MB ofzo wilt downen dan loopt de boel vast of het duurt tijden voordat ie response geeft.

Met zo'n rich tekst boxje ging het als een speer vergeleken met bovenstaand. Ik ben nu via google wat andere methodieken aan het opzoeken :)

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

code:
1
2
3
4
5
6
7
8
dim lngFreeFile as long
dim strFiledata as string
lngfreefile = freefile

Open Filename for binary as #lngfreeFIle
strfiledata = Space$(LOF(lngfreefile))
Get #lngfreefile,,strfiledata
close #lngfreefile

File zit in strFileData. Dit kan bijna niet sneller voor files van redelijke grootte <1Mb. Het kan met een bytearray, maar het verschil is denk ik niet zo groot, en je gebruikt een string om de files te versturen, dus dit is zo ongeveer de beste methode...

Edit: Het wordt zoals dit dus:
code:
1
2
3
4
5
6
7
8
9
10
dim lngFreeFile as long
dim strFiledata as string
lngfreefile = freefile

Open Filename for binary as #lngfreeFIle
strfiledata = Space$(LOF(lngfreefile))
Get #lngfreefile,,strfiledata
close #lngfreefile

Send_to_Client(strfiledata )

Verwijderd

Topicstarter
41.6C.6D.61.72:

Bedankt voor de code man. Ik was zelf ook al een eindje op weg. Het lijkt op die van jou.
code:
1
2
3
4
'handle = FreeFile 'gives a free file handle
'Open Trim(Webroot) & Right$(arydata(1), Len(arydata(1)) - 1) For Binary As handle
'file$ = Input$(LOF(handle), handle)
'Close handle

Bovenstaand was al een stuk sneller dan wat ik eerst had. Toen heb ik toch jou code even in mn project gepaste en getest en warempel die ging nog een tikje sneller. Ik heb het 2 x getest en het valt voornamelijk op bij downloaden van een testfile (via url linkje) van 800kb. Op mijn bovenstaande code duurt het 2 seconden voordat het file save dialoog verschijnt en met jouw code ongeveer 1 seconde.

Hardstikke mooi dus. Ik ben gered ! Het werkt nu voldoende goed voor kleine files en plaatjes e.d. Voorlopig stop ik nu met dit stukje en ga me eerst even wat meer richten op php integratie (indien mogelijk) http error codes e.d. Misschien dat ik later dan nog iets nodig heb om ook grotere files te verwerken maar voorlopig vind ik het zo wel goed genoeg. Kan nu tenminste wat mee de toepassing doen om te spelen.

Nogmaals dank :)

-edit-
Ik ga morgen trouwens toch nog even naar het verschil zoeken tussen de richx32.ocx-en alhoewel ik niet meer terug
ga naar die code (vermoedelijk) maar ik wil het wel graag weten waar het probleem nou zit.
-/edit-

  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 28-08 17:06

Sponge

Serious Game Developer

Hmm, vindt ik relatief nog lang... Je kunt grote files uiteraard ook streamen, zodat ze niet eerst helemaal geladenworden (of alles in de web dir sowieso in het geheugen zetten)

Verwijderd

Op dinsdag 28 mei 2002 23:07 schreef 41.6C.6D.61.72 het volgende:
Hmm, vindt ik relatief nog lang...
De 1 a 2 seconden die genoemd worden gaan (zover ik kan zien) niet over het laden van het bestand, maar voordat de webbrowser 'uiteindelijk' reageert. Het laden van een compleet bestand kan in VB bijna niet sneller dan jouw geposte code...

Het streamen van binaire bestanden vind ik sowieso netter en zou er dan ongeveer zo moeten uitzien:
code:
1
2
3
4
5
6
7
8
9
10
11
12
Dim lngFreeFile As Long
Dim strFiledata As String

lngFreeFile = FreeFile()

Open Filename For Binary As #lngFreeFile
strFileData = Space$(1024) 'Sturen in blokken van 1024 bytes
While Not EOF(lngFreeFile)
  Get #lngFreeFile, , strFileData
  Send_to_Client strFileData
Wend
Close #lngFreeFile
Pagina: 1