Za bilo kakva preciznija merenja, treba koristiti funkciju GetTickCount. Ovako se recimo može dobiti vreme koje je potrebno za izvršavanje petlje
Code:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub cmdStart_Click()
Dim I As Long
Dim lTimeStart As Long
Dim lTimeEnd As Long
Dim lTimeElapsed As Long
Dim iHours As Integer
Dim iMinutes As Integer
Dim iSeconds As Integer
lTimeStart = GetTickCount
For I = 1 To 100
DoEvents
Print "marko"
Sleep 1000
Next I
lTimeEnd = GetTickCount
lTimeElapsed = lTimeEnd - lTimeStart
iHours = (lTimeElapsed / 1000) \ 3600
iMinutes = ((lTimeElapsed / 1000) - (iHours * 3600)) \ 60
iSeconds = (lTimeElapsed / 1000) - (iHours * 3600) - (iMinutes * 60)
MsgBox "Vreme izvrsavanja:" & Format(iHours, "00") & ":" & Format(iMinutes, "00") & ":" & Format(iSeconds, "00")
End Sub
Dakle, prvo smo uzeli vrednost GetTickCount-a pre petlje, zatim vrednost posle petlje i onda izračunali razliku koja nam daje proteklo vreme u milisekundama. Onda te milisekunde mogu da se pretvore u hh:mm:ss format (kao što je urađeno u ovom primeru), a ako je potzrebno preciznije merenje, onda mogu da se doda i ostatak milisekundi na kraju. Inače, ovo Sleep 1000 u petlji, ukoliko neko nije shvatio, služi da malo prolongira vreme potrebno za izvršavanje petlje, čisto kako bi primer pokazao neko normalno vreme, a ne nešto tipa 30ms kao kada je prazna petlja. E sad, ako hoćeš da prikažeš približno vreme do završetka petlje, onda ćeš morati računanje da ubaciš u samu petlju. Znači, posle svake iteracije izračunaš koliko je vremena bilo potrebno za izvršavanje jedne iteracije, a to onda pomnožiš sa brojem preostalih iteracija. Kao osnovu, možeš ili da uzmeš ili prosek izvršenih iteracija ili samo vrednost prethodne iteracije. U drugom slučaju će procena biti preciznija, ali i "skakutava", tj. slično kao kada kopiraš neki fajl u Windowsu, a ono pokaže preostalo vreme 10 minuta, a onda nakon par sekundi, preostalo vreme 5 minuta. Inače, skroz tačno vreme prostalo do kraja izvršavanja petlje ne možeš da izračunaš, iz prostog razloga što brzina izvršenja varira za šta su odgovorni mnogi faktori. Recimo, možda cifre sa kojima se radi postaju veće kroz svaku iteraciju a računi komplikovaniji, ako si ubacio DoEvents, onda brzina izvršavanja zavisi i od ostalih procesa u sistemu, pa zatim opterećenosti procesora, memorije i slično. Jedino što možeš da prikažeš korisniku jeste procena. Dakle, ovako nekako:
Code:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Sub cmdStart_Click()
Dim I As Long
Dim J As Long
Dim lTimeStart As Long
Dim lTimeCurrent As Long
Dim lTimeEnd As Long
Dim lTimeElapsed As Long
Dim iHours As Integer
Dim iMinutes As Integer
Dim iSeconds As Integer
J = 100
For I = 1 To J
DoEvents
lTimeStart = GetTickCount
Print "marko"
Sleep 1000
lTimeCurrent = GetTickCount
lTimeElapsed = (lTimeCurrent - lTimeStart) * (J - I)
iHours = (lTimeElapsed / 1000) \ 3600
iMinutes = ((lTimeElapsed / 1000) - (iHours * 3600)) \ 60
iSeconds = (lTimeElapsed / 1000) - (iHours * 3600) - (iMinutes * 60)
lblVreme.Caption = "Preostalo vreme: " & Format(iHours, "00") & ":" & Format(iMinutes, "00") & ":" & Format(iSeconds, "00")
Next I
MsgBox "Gotovo"
End Sub
Naravno, imaj u vidu da će ovo usporiti petlju, jer inače svaka instrukcija koju ubaciš u petlju usporava istu, čak i običan progressbar, a o DoEventsu i da ne pričamo. U suštini, najbrže se izvršava petlja u kojoj nema ničeg dodatnog, ni progres bara ni doeventsa, nego samo čistokrvna, bezobrazna petlja koja uzrupira sve resurse. No, pošto na taj način korisnik dobija utisak da nešto nije u redu i da se računar zakucao, onda je bolje da postoje neki indikatori. No, ako se radi o petlji sa velikim brojem iteracija, treba biti oprezan i dodati neke optimizacije. Recimo, staviti da se preostalo vreme (ili progres bar zavisno od toga šta koristiš) ne apdejtuje baš u svakoj iteraciji, nego u svakoj 10-toj ili 20-toj recimo, ili čak svakoj 100-toj, zavisno već od toga koliko iteracija ima.
-Odracuonogakomijedrpiorazmaknicu.
-Ne rxdi mi txstxturx, kxd god hocu dx
ukucxm "x" onx ukucx "x".
-Ko kaaz e da ja neuummem da kuuca
m.
-Piše "Insert disk 3", a jedva sam i ova
dva ugurao u drajv
-Postoje samo dve osobe kojima
verujem, jedna sam ja, a druga nisi ti