Jak uzyskać KB/s odświeżane co 1s?

Jak uzyskać KB/s odświeżane co 1s?
DamianOS.MP5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 74
0

Napisałem klasę, która implementuje interfejs:

Kopiuj
class ITransferProgressClass : ITransferProgress
{
	public static TextBox txt1 = new TextBox();
	public void Report(long bytesTransferred)
	{
		txt1.Invoke(new Action(delegate()
		{
			txt1.Text = bytesTransferred.ToString();
		}));

	}

	public void Report(long bytesTransferred, long totalSize)
	{
	}
}

W innej klasie tworzę obiekt tej klasy, dzięki czemu po wciśnięciu przycisku otrzymuję poprawną ilość aktualnie wysłanych bajtów w textboxie txt1. Dane te są wyświetlane na bieżąco (odświeżane szybciej niż 1s):

Kopiuj
ITransferProgressClass progress = new ITransferProgressClass();
client.Send(message, cancellationToken, progress);

Na podstawie tych wysłanych danych i odmierzonego czasu chcę policzyć prędkość (może być w KB/s). I tu pojawia się problem: jak uzyskać takie dane odświeżane np. co 1s? Raz liczba wysłanych danych na sekundę będzie większa, raz mniejsza (w zależności od prędkości łącza). Spróbowałem coś takiego:

Kopiuj
Stopwatch stopwatch = new Stopwatch();

public void Report(long bytesTransferred)
{
	stopwatch.Start();
	txt1.Invoke(new Action(delegate()
	{
		txt1.Text = (bytesTransferred / stopwatch.Elapsed.TotalMilliseconds).ToString();
	}));
}

i to pokazuje liczbę B/ms, ale nie odświeża się - za każdym razem rośnie. Próbowałem też z timerami (InitializeTimer wywołuję w innej klasie, o której wspomniałem powyżej), lecz tutaj nic w textboxie się nie wyświetla:

Kopiuj
private Timer timer;
private const double timerUpdate = 1000;
public static TextBox txt1 = new TextBox();
long actualBytes;

public void InitializeTimer()
{
	timer = new Timer();
	timer.Interval = (int)timerUpdate;
	timer.Tick += new EventHandler(timer_Tick);
	timer.Start();
}

public void Report(long bytesTransferred)
{
	actualBytes = bytesTransferred;
}

void timer_Tick(object sender, EventArgs e)
{
	txt1.Text = actualBytes.ToString();
}

Starałem się jak najjaśniej opisać ten temat. Gdyby coś było niezrozumiałe, postaram się napisać inaczej.

SO
  • Rejestracja: dni
  • Ostatnio: dni
0

No to co sekundę pobierz ile danych się wysłało, a następnie wyzeruj licznik?

mr_jaro
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Grudziądz/Bydgoszcz
  • Postów: 5300
2

(aktualna_ilość_wysłanych - ilość_poprzednio_wysłanych) \ liczba_sekund_pomiędzy_pomiarami

DamianOS.MP5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 74
0

Właśnie o ten wzór na prędkość mi chodzi. Tylko jak dokonać tego pomiaru w moim kodzie? Z wykorzystaniem timera? Fragment kodu, który napisałem powyżej nie działa...

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
0

(aktualna_ilość_wysłanych - ilość_poprzednio_wysłanych) \ liczba_sekund_pomiędzy_pomiarami

Ja bym raczej zrobił:

Kopiuj
transfer = (aktualna_ilość_wysłanych - ilość_poprzednio_wysłanych) / (czas_obecnego_pomiaru - czas_poprzedniego_pomiaru)

W ten sposób uniezależniasz się od częstotliwości timera i od jego fluktuacji.

Właśnie o ten wzór na prędkość mi chodzi. Tylko jak dokonać tego pomiaru w moim kodzie? Z wykorzystaniem timera?

Tak, w timerze to rób.
Jako czas pomiaru bierz jakieś systemowe ticki, nie godzinę zegarową. Potem wynik trzeba będzie przeliczyć na sekundy i na kilobajty.

DamianOS.MP5
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 74
0

Wiem co zrobić, ale nie wiem jak zrobić... Próbuję i próbuję i nie wychodzi. Gdzie w kodzie, który wysłałem, wstawić timer, żeby co 1s tick można było zapisać do zmiennej wynik z (aktualna_ilość_wysłanych - ilość_poprzednio_wysłanych)? W którym miejscu pobrać samą wartość aktualna_ilość_wysłanych i ilość_poprzednio_wysłanych?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.