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?
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):
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.