Partagez votre expérience de PureBasic avec les autres utilisateurs.
Droopy
Messages : 1151 Inscription : lun. 19/juil./2004 22:31
Message
par Droopy » dim. 23/oct./2005 13:59
J'en ai eu besoin pour générer des fichiers de taille déterminée
Code : Tout sélectionner
; Each paquet is 10Mo
; If you want 100Mb File : Block = 10
; The limit is 4Gb file
Procedure CreateBigFile(File.s,Block)
InitBigString()
CreateFile(0,File)
Paquet.s=Space(1024*1024*10) ;/ Each Packet is 10Mb
For n=1 To Block
FileSeek(Lof())
WriteString(Paquet)
Next
CloseFile(0)
FreeBigString()
EndProcedure
;/ Test
#File="c:\Big.bin"
CreateBigFile(#File,10)
MessageRequester(#File,Str(FileSize(#File)/1024/1024)+" Mb")
Anonyme2
Messages : 3518 Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans
Message
par Anonyme2 » dim. 23/oct./2005 14:10
c'est quoi le InitBigString() ?
Je suppose que c'est pour définir des chaînes > à 64 Ko
nico
Messages : 3702 Inscription : ven. 13/févr./2004 0:57
Message
par nico » dim. 23/oct./2005 14:28
Je ne sais pas pour les autres mais mettre une lib en truc et astuce, c'est pas sa place; met le plutôt en annonce. Surtout que le code est connu en plus.
LeCyb
Messages : 273 Inscription : dim. 26/déc./2004 20:49
Message
par LeCyb » dim. 23/oct./2005 15:05
J'ajoutterais que c'est super chiant de donner des exemples qui utilisent des librairies tierces.
Vive le thread-safe !
Droopy
Messages : 1151 Inscription : lun. 19/juil./2004 22:31
Message
par Droopy » dim. 23/oct./2005 15:08
Désolé j'ai pas fait attention
Droopy
Messages : 1151 Inscription : lun. 19/juil./2004 22:31
Message
par Droopy » dim. 23/oct./2005 15:11
Voila le code pour gérer les String > 64Ko
Code : Tout sélectionner
;/ Author : BugString by Deeém2031 and PureFan
; You want bigger string than 64000 Kb
; Or just lower memory-usage whether You use small strings?
; Use this: (but don't use the big strings with "Debug",
; the Debugger still have a limit To 64000B)
Structure EXCEPTIONREPORTRECORD
ExceptionCode.l
fHandlerFlags.l
*NestedExceptionReportRecord.EXCEPTIONREPORTRECORD
*ExceptionAddress.l
cParameters.l
ExceptionInfo.l[#EXCEPTION_MAXIMUM_PARAMETERS]
EndStructure
Global BigString_Base, BigString_BaseSize, BigString_OldExceptionHandler
Procedure StringExceptionHandler(*ExceptionInfo.EXCEPTION_POINTERS)
Protected BigString_BaseEnd, tmp
*ExceptionRecord.EXCEPTIONREPORTRECORD = *ExceptionInfo\pExceptionRecord
If *ExceptionRecord\ExceptionCode = #EXCEPTION_ACCESS_VIOLATION
If *ExceptionRecord\cParameters = 2
BigString_BaseEnd = BigString_Base+BigString_BaseSize
If *ExceptionRecord\ExceptionInfo[1]&$FFFFF000 = BigString_BaseEnd-$1000
VirtualProtect_(BigString_BaseEnd-$1000,$1000,#PAGE_READWRITE,@tmp)
If VirtualAlloc_(BigString_BaseEnd,$1000,#MEM_COMMIT,#PAGE_NOACCESS)
BigString_BaseSize+$1000
ProcedureReturn #EXCEPTION_CONTINUE_EXECUTION
EndIf
MessageRequester("Error","Kein Speicher mehr da, der String ist zu groß.",16)
EndIf
EndIf
EndIf
ProcedureReturn CallFunctionFast(BigString_OldExceptionHandler,*ExceptionInfo)
EndProcedure
ProcedureDLL InitBigString()
If BigString_Base
VirtualFree_(BigString_Base, BigString_BaseSize, #MEM_RELEASE)
EndIf
BigString_Base = VirtualAlloc_(#Null,$10000000,#MEM_RESERVE,#PAGE_READWRITE)
If BigString_Base
BigString_BaseSize = $2000
!PUSH dword[PB_StringBase]
!PUSH 0
!PUSH dword[PB_MemoryBase]
!EXTRN _HeapFree@12
!CALL _HeapFree@12
If VirtualAlloc_(BigString_Base,BigString_BaseSize,#MEM_COMMIT,#PAGE_READWRITE)
!MOV dword[PB_StringBase], eax
VirtualProtect_(BigString_Base+(BigString_BaseSize-$1000),$1000,#PAGE_NOACCESS,@tmp)
BigString_OldExceptionHandler = SetUnhandledExceptionFilter_(@StringExceptionHandler())
ProcedureReturn #True
EndIf
EndIf
ProcedureReturn #False
EndProcedure
ProcedureDLL FreeBigString()
VirtualFree_(BigString_Base, BigString_BaseSize, #MEM_RELEASE)
SetUnhandledExceptionFilter_(BigString_OldExceptionHandler)
!PUSH 64000
!PUSH 8 ;HEAP_ZERO_MEMORY
!PUSH dword[PB_MemoryBase]
!EXTRN _HeapAlloc@12
!CALL _HeapAlloc@12
!MOV dword[PB_StringBase], eax
EndProcedure
Chris
Messages : 3731 Inscription : sam. 24/janv./2004 14:54
Contact :
Message
par Chris » dim. 23/oct./2005 15:13
LeCyb a écrit : J'ajoutterais que c'est super chiant de donner des exemples qui utilisent des librairies tierces.
Je ne vois pas ou est le problème, à partir du moment ou l'exemple n'est pas basé uniquement sur une, (ou plusieurs), des fonctions de la lib.
Par contre, quand un exemple utilise une lib, ce serait bien de le mentionner, et de mettre un lien permettant de la télécharger.
LeCyb
Messages : 273 Inscription : dim. 26/déc./2004 20:49
Message
par LeCyb » dim. 23/oct./2005 22:37
Pour info, normalement la librairie des chaînes devrait subir un solide lifting dans la version 4 (thread-safe etc...).
Sinon pour faire sauter la limite des chaînes y'a nettement plus simple sans changer le code existant, il suffit d'appeler cette procédure (une seule fois) avant toute manipulation de chaîne:
Code : Tout sélectionner
Procedure SetStringManipulationBufferSize(Bytes)
PBStringBase.l = 0
PBMemoryBase.l = 0
!MOV eax, dword [PB_StringBase]
!MOV [esp+4],eax
!MOV eax, dword [PB_MemoryBase]
!MOV [esp+8],eax
HeapReAlloc_(PBMemoryBase, #GMEM_ZEROINIT, PBStringBase, Bytes)
!MOV dword [_PB_StringBase],eax
EndProcedure
Le paramètre est une taille en bytes pour fixer le buffer mémoire.
Vive le thread-safe !