Algorytm wyliczający czas potrzebny do skopiowania danych

0

Witam serdecznie,

mam dość nietypowy problem związany z wyliczaniem przewidywanego czasu kopiowanych danych. Chodzi mi tu mianowicie o coś takiego jak w systemie Windows, że podczas kopiowania pliku pojawia się okienko postępu wraz z przewidywanym czasem skopiowania tego pliku.
Mam z tym trochę problemów i w zasadzie do dzisiaj nie udało mi się napisać funkcji obliczającej w czasie rzeczywistym czas potrzebny do skopiowania pliku. Z teoretycznego punku widzenia sprawa wygląda niby prosto...

przykładowo:

  • mam do skopiowania plik o rozmiarze np. 10 000 bajtów roz = 10000
  • procedura podczepiona pod Timer mierzy co 1s ilość skopiowanych danych: tu dla przykładu w ciągu 1s zostało przekopiowanych 1 000 bajtów Bt = 1000
  • stąd z prostego wzoru: t = roz / Bt wynika, że 10 000 bajtów zostanie przekopiowanych w ciągu 10s ( t = 10000 / 1000).

W praktyce sprawa u mnie wygląda zupełnie inaczej. Procedura źle mierzy czas co w konsekwencji daje fałszywy wynik. Do kopiowania używam funkcji BlockRead i BlockWrite co dodatkowo komplikuje mi sprawę, gdyż w tym przypadku dane nie są kopiowane bajt po bajcie ale poprzez bufor o określonej z góry wielkości.

Tak więc zwracam się z prośbą do osób, które wiedzą jak napisać taką procedurę bądź funkcję, o podanie kilku wskazówek pomocnych w rozwiązaniu mojego problemu. Być możliwe, że wielu z Was już kiedyś coś podobnego napisały. Wszelkie wskazówki i algorytmy będą mile widziane.

Z góry dziękuję.

Pozdrawiam i czekam na odpowiedź.
Do usłyszenia

0
StartTime = Now
TotalSize = FileSize(file)
TotalCopied = 0

w pętli
BlockRead(...Size)

TotalCopied += Size
Elapsed = Now - StartTime
TotalEstimated = Elapsed*TotalSize/TotalCopied
LeftEstimated = TotalEstimated-Elapsed

BlockWrite(...)

zamiast

Elapsed = Now - StartTime
TotalEstimated = Elapsed*TotalSize/TotalCopied
LeftEstimated = TotalEstimated-Elapsed

możesz dać
LeftEstimated = (Now - StartTime)*(TotalSize/TotalCopied-1)

no i jeszcze musisz sprawdzić, czy TotalCopied <> 0, żeby przez zero przypadkiem nie podzielić (chociaż Chuck Norris potrafi).

0

No nie wiem jak ja Ci się odwdzięczę... [browar] Działa wyśmienicie. :-)

Bardzo Ci dziękuję za pomoc. Co prawda troszkę się nakombinowałem z typami zmiennych, ale udało mi się to wszystko poskładać w całość. ;] Teraz widzę, że swoim tokiem myślenia odbiegałem od tego algorytmu ;-P

Jeszcze raz dziękuję i pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1