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

0

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

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

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:

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:

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.

0

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

2

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

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...

0

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

Ja bym raczej zrobił:

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.

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?

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