[Delphi] Indy Client - szybki odbior i konwersja danych

0

Problem dotyczy obsługi odbieranych danych przy pomocy Indy Client.
Na podstawie przykładów Indy :
a) Odbieram dane (dwie paczki wysyłane w TCP jedna 1400 druga 500 bajtów).
b) Odbieranie wykonywałem przy pomocy timera oraz wątków – póki co nie wiem, która metoda będzie dla mnie lepsza (wstępnie obie dobrze działają).
c) Wysyłanie pakietów odbywa się z częstotliwością średnio co 20 – 30 ms.
Problemem, jaki napotkałem jest szybkie przetworzenie danych, (które są hexem – 4 bajty mają odpowiadać jednej wartości np. FFFF = 65535.
Moje pytanie jest następujące – czy fizycznie jestem w stanie obsłużyć taką procedurę – ze względu na czas wykonywania. Dodatkowo chce całość wizualizować w Tcharcie (w moim przypadku będą to dwa wykresy po 485 danych).
Wstępnie moja procedura jest za wolna:
a) Odczyt danych (Readln – w przypadku timera)
b) Zapisanie do tablicy po 4 bajty (pętla for – długi czas)
c) Konwersja strtohex oraz hextoint
d) Wyświetlenie danych na wykresie
Czy ktoś może wykonywał podobne zadanie?

0
Orbea napisał(a)

a) Odczyt danych (Readln – w przypadku timera)

W obu przypadkach uzywane jest Readln w watkach tez z tym ze tam oczekiwanie na dane wynosi 0 albo 1 ms wiec powinno byc szybsze.

Orbea napisał(a)

b) Zapisanie do tablicy po 4 bajty (pętla for – długi czas)

Po co zapisujesz do tablicy, czemu ma to sluzyc? I dlaczego uzywasz petli for zamiast dopisywac do konca tablicy nowe dane?

Orbea napisał(a)

c) Konwersja strtohex oraz hextoint

To nie powinno byc zauwazalne, chyba ze konwertujesz setki tysiace znakow na sekunde?

Orbea napisał(a)

d) Wyświetlenie danych na wykresie

No duze zalezy od tego jak ten wykres rysujesz...

Sprawdz profilerem gdzie masz bottlenecki?

0
Wodzu napisał(a)
Orbea napisał(a)

a) Odczyt danych (Readln – w przypadku timera)

W obu przypadkach uzywane jest Readln w watkach tez z tym ze tam oczekiwanie na dane wynosi 0 albo 1 ms wiec powinno byc szybsze.

Kiedy stosuje komende Readln i robie podglad odebranych danych w memo okazuje się, iż są one podzielone (przejście do nowej linii). Poprawną pracę uzyskałem stosując IdTCPClient1.CurrentReadBuffer (dane są w jednym ciągu).
Musze teraz sprawdzić jak dokładnie działa funkcja CurrentReadBuffer - czy oczyszcza sie po każdym odebraniu danych. Nie mogę znaleźć jakiegoś dobrego opisu indego. Istotne dla mnie jest to abym miał dostęp do dwóch pakietów wysłanych z servera (jeden 1400 i drugi 500 bajtów). Aktualnie działam z Timerem który z minimalnym interwałem odczytuje wartości i je rysuje.

Wodzu napisał(a)
Orbea napisał(a)

b) Zapisanie do tablicy po 4 bajty (pętla for – długi czas)

Po co zapisujesz do tablicy, czemu ma to sluzyc? I dlaczego uzywasz petli for zamiast dopisywac do konca tablicy nowe dane?

Do tablicy zapisuje ponieważ muszę dokonać konwersji na hexa - tutaj znalazłem już dobre rozwiazanie.

Wodzu napisał(a)
Orbea napisał(a)

c) Konwersja strtohex oraz hextoint

To nie powinno byc zauwazalne, chyba ze konwertujesz setki tysiace znakow na sekunde?

Konwertuje około 1000 znaków

Wodzu napisał(a)
Orbea napisał(a)

d) Wyświetlenie danych na wykresie

No duze zalezy od tego jak ten wykres rysujesz...

Wykres rusuje dodajac do charta punkty w serii po każdej konwersji na hexa.</quote></quote>

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