Code archives/Miscellaneous/Read/Write Progress Meters
This code has been declared by its author to be Public Domain code.
Download source code
| |||||
| Substituting for Read/Wrirte/Peek or Poke etc. these functions allow for the progress of reading/writing to be measured and potentially displayed on-screen or whatever else may be required. The functions themselves due to the calculations and byte-by-byte nature can be rather slow, so it's not really recommended for use as-is in efficient projects, however, they should serve as a working example of how the functionality can be used in one's own work. | |||||
Global nPROGRESS_CURRENT_BYTES%
Global nPROGRESS_MAXIMUM_BYTES%
Global nPROGRESS_DIR_MAXIMUM_BYTES%
Global nPROGRESS_DIR_CURRENT_BYTES%
Global nPROGRESS_BANK_MAXIMUM_BYTES%
Global nPROGRESS_BANK_CURRENT_BYTES%
; Example:
Graphics 1024,768,32,6
SetBuffer BackBuffer()
Global sPath$=GetEnv("ProgramFiles")+"\Blitz3D"
If Right(sPath,1)<>"\" Then sPath=sPath+"\"
Local hDir=hReadProgressDir(sPath)
Local sFileName$=NextFile(hDir)
While (sFileName<>"")
If (Right(sFileName,1)<>".")
hFile=hReadFileProgress(sPath+sFileName)
If (hFile)
While (Not (Eof(hFile)))
nReadByteProgress(hFile)
Cls
DisplayProgressBar(0,0,256,32,nProgressDir(),sPath+" ("+Str(nProgressDir())+"%)")
DisplayProgressBar(0,128,256,32,nProgress(),sFIleName+" ("+Str(nProgress)+"%)")
Flip
If (bProgressDirComplete())
CloseFile hFile
Exit
End If
Wend
End If
End If
sFileName$=NextFile(hDir)
If (bProgressDirComplete()) Then Exit
Wend
CloseDir hDir
;Functions
Function SetByteLimit(nLimit%)
nPROGRESS_MAXIMUM_BYTES=nLimit
End Function
Function SetDirByteLimit(nLimit%)
nPROGRESS_DIR_MAXIMUM_BYTES=nLimit
End Function
Function SetBankByteLimit(nLimit%)
nPROGRESS_BANK_MAXIMUM_BYTES=nLimit
End Function
Function SetProgress(nBytes%)
nPROGRESS_CURRENT_BYTES=nBytes
End Function
Function SetProgressPercent%(fPercent#)
nPROGRESS_CURRENT_BYTES=Int((Float(nPROGRESS_MAXIMUM_BYTES)*0.01*fPercent))
Return nPROGRESS_CURRENT_BYTES
End Function
Function SetProgressDir(nBytes%)
nPROGRESS_DIR_CURRENT_BYTES=nBytes
End Function
Function SetProgressDirPercent%(fPercent#)
nPROGRESS_DIR_CURRENT_BYTES=Int((Float(nPROGRESS_DIR_MAXIMUM_BYTES)*0.01*fPercent))
Return nPROGRESS_DIR_CURRENT_BYTES
End Function
Function SetProgressBank(nBytes%)
nPROGRESS_BANK_CURRENT_BYTES=nBytes
End Function
Function SetProgressBankPercent%(fPercent#)
nPROGRESS_BANK_CURRENT_BYTES=Int((Float(nPROGRESS_BANK_MAXIMUM_BYTES)*0.01*fPercent))
Return nPROGRESS_BANK_CURRENT_BYTES
End Function
;--
Function hCreateBankProgress(nBankSize%)
Local hReturn%=CreateBank(nBankSize)
nPROGRESS_BANK_MAXIMUM_BYTES=nBankSize
nPROGRESS_BANK_CURRENT_BYTES=0
End Function
Function ResizeBankProgress(hBank,nSize%)
nPROGRESS_BANK_MAXIMUM_BYTES=nSize
ResizeBank hBank,nSize
End Function
Function ResetProgress()
nPROGRESS_CURRENT_BYTES=0
End Function
Function ResetProgressDir()
nPROGRESS_DIR_CURRENT_BYTES=0
End Function
Function ResetProgressBank()
nPROGRESS_BANK_CURRENT_BYTES=0
End Function
Function ProgressSkip()
nPROGRESS_CURRENT_BYTES=nPROGRESS_MAXIMUM_BYTES
End Function
Function ProgressDirSkip()
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_MAXIMUM_BYTES
End Function
Function ProgressBankSkip()
nPROGRESS_BANK_CURRENT_BYTES=nPROGRESS_BANK_MAXIMUM_BYTES
End Function
Function bProgressComplete%()
Return (nPROGRESS_CURRENT_BYTES>=nPROGRESS_MAXIMUM_BYTES)
End Function
Function bProgressDirComplete%()
Return (nPROGRESS_DIR_CURRENT_BYTES>=nPROGRESS_DIR_MAXIMUM_BYTES)
End Function
Function bProgressBankComplete%()
Return (nPROGRESS_BANK_CURRENT_BYTES>=nPROGRESS_BANK_MAXIMUM_BYTES)
End Function
;--
Function hReadProgressDir%(sDirPath$)
nPROGRESS_DIR_CURRENT_BYTES=0
nPROGRESS_DIR_MAXIMUM_BYTES=0
Local hReturn%=0
If (FileType(sDirPath)=2)
hReturn=ReadDir(sDirpath)
Local sFile$=NextFile(hReturn)
While (sFile<>"")
If (Right(sFile,1)<>".")
nPROGRESS_DIR_MAXIMUM_BYTES=nPROGRESS_DIR_MAXIMUM_BYTES+FileSize(sDirPath+sFile)
End If
sFile=NextFile(hReturn)
Wend
CloseDir hReturn
hReturn=ReadDir(sDirPath)
End If
nPROGRESS_CURRENT_BYTES=0
Return hReturn
End Function
;--
Function hReadFileProgress%(sFilepath$)
Local hReturn%=0
If (FileType(sFilepath)=1)
nPROGRESS_MAXIMUM_BYTES=FileSize(sFilepath)
nPROGRESS_CURRENT_BYTES=0
hReturn=ReadFile(sFilepath)
End If
Return hReturn
End Function
Function hOpenFileProgress%(sFilepath$)
Local hReturn%=0
If (FileType(sFilepath)=1)
nPROGRESS_MAXIMUM_BYTES=FileSize(sFilepath)
nPROGRESS_CURRENT_BYTES=0
hReturn=OpenFile(sFilepath)
End If
Return hReturn
End Function
Function sReadLineProgress$(hFilehandle)
Local sReturn$=ReadLine(hFilehandle)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+Len(sReturn)+1 ;Add 1 for terminator
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+Len(sReturn)+1
Return sReturn
End Function
Function nReadIntProgress%(hFilehandle)
Local nReturn%=ReadInt(hFilehandle)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+4
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+4
Return nReturn
End Function
Function nReadShortProgress(hFilehandle)
Local nReturn%=ReadShort(hFilehandle)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+2
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+2
Return nReturn
End Function
Function sReadStringProgress$(hFilehandle)
Local sReturn$=ReadString(hFilehandle)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+Len(sReturn)+1 ; Add 1 for terminator
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+Len(sReturn)+1
Return sReturn
End Function
Function fReadFloatProgress#(hFilehandle)
Local fReturn#=ReadFloat(hFilehandle)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+4
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+4
Return fReturn
End Function
Function nReadByteProgress$(hFilehandle)
Local nReturn=ReadByte(hFilehandle)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+1
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+1
Return nReturn
End Function
Function nPeekByteProgress%(hBank%,nOffset%)
Local nReturn%=PeekByte(hBank,nOffset)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+1
nPROGRESS_BANK_CURRENT_BYTES=nPROGRESS_BANK_CURRENT_BYTES+1
Return nReturn
End Function
Function nPeekIntProgress%(hBank%,nOffset%)
Local nReturn%=PeekInt(hBank,nOffset)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+4
nPROGRESS_BANK_CURRENT_BYTES=nPROGRESS_BANK_CURRENT_BYTES+4
Return nReturn
End Function
Function fPeekFloatProgress%(hBank%,nOffset%)
Local fReturn#=PeekFloat(hBank,nOffset)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+4
nPROGRESS_BANK_CURRENT_BYTES=nPROGRESS_BANK_CURRENT_BYTES+4
Return fReturn
End Function
Function nPeekShortProgress%(hBank%,nOffset%)
Local nReturn%=PeekShort(hBank,nOffset)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+2
nPROGRESS_BANK_CURRENT_BYTES=nPROGRESS_BANK_CURRENT_BYTES+2
Return nReturn
End Function
;--
Function WriteLineProgress$(hFilehandle,sLine$)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+Len(sLine)+1 ;Add 1 for terminator
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+Len(sLine)+1
WriteLine hFileHandle,sLine
End Function
Function WriteIntProgress%(hFilehandle,nInt%)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+4
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+4
WriteInt hFileHandle,nInt
End Function
Function WriteShortProgress%(hFilehandle,nShort%)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+2
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+2
WriteShort hFileHandle,nShort
End Function
Function WriteStringProgress$(hFilehandle,sString$)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+Len(sString)+1 ;Add 1 for terminator
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+Len(sString)+1
WriteString hFileHandle,sString
End Function
Function WritefloatProgress%(hFilehandle,fFloat#)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+4
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+4
WriteFloat hFileHandle,fFLoat
End Function
Function WriteByteProgress%(hFilehandle,nInt%)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+1
nPROGRESS_DIR_CURRENT_BYTES=nPROGRESS_DIR_CURRENT_BYTES+1
WriteByte hFileHandle,nInt Mod 256
End Function
Function PokeByteProgress%(hBank%,nOffset%,nByte%)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+1
nPROGRESS_BANK_CURRENT_BYTES=nPROGRESS_BANK_CURRENT_BYTES+1
PokeByte hBank,nOffset,nByte
End Function
Function PokeIntProgress%(hBank%,nOffset%,nInt%)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+4
nPROGRESS_BANK_CURRENT_BYTES=nPROGRESS_BANK_CURRENT_BYTES+4
PokeInt hBank,nOffset,nInt
End Function
Function PokeFloatProgress%(hBank%,nOffset%,fFloat%)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+4
nPROGRESS_BANK_CURRENT_BYTES=nPROGRESS_BANK_CURRENT_BYTES+4
PokeFloat hBank,nOffset,fFloat
End Function
Function PokeShortProgress%(hBank%,nOffset%,nShort%)
nPROGRESS_CURRENT_BYTES=nPROGRESS_CURRENT_BYTES+2
nPROGRESS_BANK_CURRENT_BYTES=nPROGRESS_BANK_CURRENT_BYTES+2
PokeShort hBank,nOffset,nShort
End Function
;--
Function nProgress%()
Return Int (fPercentage(nPROGRESS_CURRENT_BYTES,nPROGRESS_MAXIMUM_BYTES))
End Function
Function nProgressDir%()
Return Int (fPercentage(nPROGRESS_DIR_CURRENT_BYTES,nPROGRESS_DIR_MAXIMUM_BYTES))
End Function
Function nProgressBank%()
Return Int (fPercentage(nPROGRESS_BANK_CURRENT_BYTES,nPROGRESS_BANK_MAXIMUM_BYTES))
End Function
Function DisplayProgressBar(X%,Y%,Width%,Height%,nProportion%,Txt$)
Color 255,255,255
Rect X,Y,Width,Height,0
Text X,Y+Height*1.5,Txt$
Color 255,0,0
Rect X+1,Y+1,Width-2,Height-2,1
Color 0,255,0
Rect X+1,Y+1,nProportion*0.01*(Width-2),Height-2,1
End Function
Function fPercentage#(nFraction%,nMaximum%)
If (nFraction=nMaximum) Then Return 100.0
If (nFraction)*(nMaximum)
Return Float(nFraction)/Float(nMaximum)*100
End If
Return 0.0
End Function |
Comments
None.
Code Archives Forum