Code archives/Miscellaneous/Read/Write Progress Meters

This code has been declared by its author to be Public Domain code.

Download source code

Read/Write Progress Meters by _PJ_2010
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