[C#]Obliczanie pozostałego czasu pobierania


(Oski225) #1

Witam,

napisałem funkcję, która miała szacować, ile czasu dany plik będzie się ściągał.

DoKonca = (Wielkosc - (int)Aktualnie) / (int)Predkosc;

                DoKonca = DoKonca / 60;

Funkcja wywoływana jest co sekundę(tak samo jak funkcja obliczająca ile jest aktualnie ściągniętych danych, i jaka jest prędkość).

Myślałem, że uzyskam szacunkowy czas w minutach, jednakże wychodzą mi liczby całkowicie do minut nie zbliżone(np. 3619, podczas gdy plik ściąga się w czasie 3-5min).

Czy jest w c# jakaś wbudowana funkcja, która pozwala na obliczanie czasu? Jeśli nie jak mogę poprawić swoją funkcję, żeby pokazywała szacowany czas do końca pobierania pliku?


(somekind) #2

A jak liczysz rozmiar aktualnie ściągniętych danych i prędkość?


(Oski225) #3

Przy wklejaniu na forum kodu, znalazłem bląd, który powodował problem. Mianowicie dzieliłem b przez kb, tak jak w kodzie:

void client_DownloadProgressChanged(object sender, System.Net.DownloadProgressChangedEventArgs e)

        {

            Aktualnie = e.BytesReceived;

            /*....*/

        }


        void timer_Tick(object sender, EventArgs e)

        {

            Predkosc = Aktualnie - Poprzednio;

            Predkosc = Predkosc / 1024;

            Poprzednio = Aktualnie;

        }


        void timer2_Tick(object sender, EventArgs e)

        {

            try

            {

                DoKonca = (Wielkosc2 - (int)Aktualnie) / (int)Predkosc;

                DoKonca = DoKonca / 1024; // tej linijki nie było

                DoKonca = DoKonca / 60;

            }

            catch

            {


            }

        }

Jednakże co zrobić, aby pokazywał się czas w dokładności co do sekundy? (Np. 1min40sek). W tym momencie czas skacze w samych minutach. [EDIT] Ok, chyba mi się udało wykonać zadanie. Napisałem coś takiego(pozbyłem się jednego timera):

Predkosc = Aktualnie - Poprzednio;

                Predkosc = Predkosc / 1024;

                DoKoncaMin = (Wielkosc2 - (int)Aktualnie) / (int)Predkosc;

                DoKoncaMin = DoKoncaMin / 1024;

                DoKoncaSek = DoKoncaMin % 60;

                DoKoncaMin = DoKoncaMin / 60;

                Poprzednio = Aktualnie;

Ostatnie pytanie - czy ten kod jest poprawny?


(somekind) #4

Nie.

Najpierw obliczasz całkowitą liczbę minut (bo wymuszasz przez dzielenie intów), więc gubisz informację o sekundach. Jak zatem chcesz ją potem odzyskać?

Jednostką czasu jest sekunda, więc jej należałoby użyć do obliczeń. Wystarczyłoby zrobić coś takiego:

int rozmiarCałkowity = 1000; //kb

int rozmiarPobrany = 300; //kb

int prędkość = 10; //kb/s


int pozostałoSekund = (rozmiarCałkowity - rozmiarPobrany) / prędkość;

TimeSpan ts = new TimeSpan(0, 0, pozostałoSekund);

Console.WriteLine("Pozostało minut: {0} sekund: {1}", ts.Minutes, ts.Seconds);

Natomiast co do całości zagadnienia - ja bym to zrobił tak, że co sekundę obliczałbym różnicę między rozmiarem całkowitym a rozmiarem pobranym i dzielił przez czas, który upłynął od początku. Wtedy można by obliczyć średnią prędkość i użyć jej do szacowania w kodzie jak wyżej.


(Oski225) #5

Dziękuje za pomoc. Teraz trochę popracuję nad kodem i będzie OK.

Pozdrawiam.