CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Synchronizacja danych pomiędzy aplikacjami.

Synchronizacja danych pomiędzy aplikacjami.

problemy z tworzeniem programów do obsługi sieci, internetu, e-mail itp..

Synchronizacja danych pomiędzy aplikacjami.

Nowy postprzez fl3xxip » środa, 13 lutego 2013, 16:33

Cześć ;)

Ostatnio stworzyłem dość prosty komunikator działający na zasadzie dwóch aplikacji : klient i serwer.
Generalnie chyba wszystko działa jak należy, tylko natrafiłem na pewien problem.
Z chwilą gdy klient łączy się z serwerem, przesyła do serwera nick użytkownika, a serwer zapisuje sobie ten nick i dodaje go do listboxa.
Wszystko fajnie, tylko pomyślałem, żeby zrobić to w odwrotną stronę : chciałem, żeby lista dostępnych użytkowników była widoczna na każdym kliencie.

Do rozsyłania wszelkich komunikatów itp z serwera do wszystkich klientów zrobiłem prostą funkcję.
KOD cpp:     UKRYJ  
void TForm17::Rozeslij(AnsiString wiadomosc){
for(int x = 0; x < ServerSocket1->Socket->ActiveConnections; x++){
   ServerSocket1->Socket->Connections[x]->SendText(wiadomosc);
   Sleep(1);
}

Teraz oczywiście każdy pomyśli : WTF? Po co ci ten Sleep?
Bez tego Sleepa mój klient zostanie zalany pakietami i nie będzie wiedział o co chodzi, ale to wytłumaczę za chwilę.

Do synchronizacji listy aktualnie zalogowanych użytkowników zrobiłem kolejną prostą funkcję, która korzysta z funkcji podanej powyżej.
KOD cpp:     UKRYJ  
void TForm17::Synchronizuj(){
Sleep(5);
Rozeslij("synch");
Sleep(5);
for(int x = 0; x < ListBox1->Items->Count; x++){
 Rozeslij(ListBox1->Items->Strings[x]);
 Sleep(1);
 }
Sleep(5);
Rozeslij("koniec");
Sleep(5);
}


Zostawmy jeszcze na chwilę te Sleep'y. Jak już można się domyśleć, działanie tego wielce skomplikowanego procesu synchronizacji jest następujące:

1. Serwer wysyła do każdego klienta wiadomość "synch".
2. Klient w zdarzeniu OnRead sprawdza, czy przesłana do niego wiadomość to "synch". Jeśli tak, to ustawia odpowiednią zmienną na true i od tego momentu wszystkie wiadomości jakie dostanie, wpisuje do swojego ListBoxa. Oczywiście tymi wiadomościami są nazwy użytkowników.
3. Z chwilą gdy klient dostanie wiadomość "koniec", zmienna jest ustawiana na false i wszystkie komunikaty które od tej chwili dostaje, wpisuje normalnie do swojego Memo.


Jestem przekonany, że można zrobić to w jakiś cywilizowany sposób, a nie tak jak ja. Teraz co do tych Sleepów. Głównym problemem jest to, że muszę dać czas klientowi na odebranie tego komunikatu, przejście przez wszystkie if'y itd. W przeciwnym wypadku po stronie klienta panuje totalna anarchia. Problem ten występuje tylko gdy chce przeprowadzić synchronizację zaraz po podłączeniu klienta do serwera. W przeciwnym wypadku, gdy np zrobie sobie buttona z funkcją Synchronizuj(), wszystko będzie ok (oczywiście dalej wszystko na Sleepach);

Teraz pytania:

1. Jak przeprowadzać cały proces synchronizacji? Czy przebudować go całkiem, czy lekko zmodyfikować?
2. Jak (nie używając Sleepa) poczekać, aż serwer wyśle wszystkie informacje do klienta, a ten je odbierze?

Z góry dzięki za pomoc ;)
Avatar użytkownika
fl3xxip
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): środa, 13 lutego 2013, 14:26
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Kubuntu
Kompilator: gcc
Gadu Gadu: 0
    Windows 7Chrome

Re: Synchronizacja danych pomiędzy aplikacjami.

Nowy postprzez Mironas » środa, 13 lutego 2013, 16:50

Jedno z tysiąca możliwych rozwiązań:

Po stronie klienta w OnRead buforuj wszystko bez względu na typ wiadomości. Bez żadnych IF-ów i innych spowalniaczy.
Za pomocą timera cyklicznie sprawdzaj stan bufora i jeśli będzie tam kompletny komunikat to wykonaj dla niego stosowne operacje. Na koniec usuń komunikat z bufora.

Za ten post autor Mironas otrzymał podziękowanie od:
fl3xxip
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Synchronizacja danych pomiędzy aplikacjami.

Nowy postprzez fl3xxip » czwartek, 14 lutego 2013, 01:17

Przyznam szczerze, że trochę nie rozumiem. O jaki kompletny komunikat chodzi?
Serwer wysyła do klienta dane przez SendText, klient to odbiera i od razu printuje albo do Memo albo do ListBoxa.
Poza tym wychodzi na to, że bez if'ów i tak sie nie obejdzie, więc trzeba by było jakby zawieszać sesję dopóki cała synchronizacja się nie skończy.

Mógłbym cię prosić żebyś jakoś bardziej to rozwinął, albo podał jeszcze inne rozwiązanie?
Avatar użytkownika
fl3xxip
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): środa, 13 lutego 2013, 14:26
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Kubuntu
Kompilator: gcc
Gadu Gadu: 0
    Windows 7Chrome

Re: Synchronizacja danych pomiędzy aplikacjami.

Nowy postprzez polymorphism » czwartek, 14 lutego 2013, 11:07

O jaki kompletny komunikat chodzi?

Chodzi mu o pełny pakiet SYNCH. Czyli najpierw odbierasz kompletny pakiet (składasz go z fragmentów, które socket odbierze), po czym wypisujesz aktywnych klientów w kontrolce.

p.s. Sleepy są zbędne.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
fl3xxip
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Synchronizacja danych pomiędzy aplikacjami.

Nowy postprzez Mironas » czwartek, 14 lutego 2013, 11:11

Może źle Cię zrozumiałem ale napisałeś:
Głównym problemem jest to, że muszę dać czas klientowi na odebranie tego komunikatu, przejście przez wszystkie if'y itd

Dlatego zaproponowałem abyś w procesie odbierania komunikatów nie analizował ich (nie stosował ifów) tylko wszystkie wrzucał do jednego wora. Dopiero potem, cyklicznie przeglądał bufor i decydował gdzie który komunikat ma trafić.

Może zamiast Sleep zastosować:
KOD cpp:     UKRYJ  
Application->ProcessMessages();
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Synchronizacja danych pomiędzy aplikacjami.

Nowy postprzez Mironas » czwartek, 14 lutego 2013, 11:16

polymorphism napisał(a):Chodzi mu o pełny pakiet SYNCH. Czyli najpierw odbierasz kompletny pakiet (składasz go z fragmentów, które socket odbierze)[...]

Zgadza się.
Właśnie po to jest potrzeby bufor.
Avatar użytkownika
Mironas
Programista I
Programista I
 
Posty: 427
Dołączył(a): poniedziałek, 2 stycznia 2012, 19:02
Podziękował : 17
Otrzymał podziękowań: 61
System operacyjny: Windows 10
Kompilator: C++Builder 10.3 Rio
TMS Components Pack
Gadu Gadu: 0
    Windows XPChrome

Re: Synchronizacja danych pomiędzy aplikacjami.

Nowy postprzez fl3xxip » poniedziałek, 18 lutego 2013, 15:27

Trochę mnie nie było, ale teraz się do tego zabrałem.

Dzięki za pomysł, działa super ;)
Avatar użytkownika
fl3xxip
Bladawiec
Bladawiec
 
Posty: 3
Dołączył(a): środa, 13 lutego 2013, 14:26
Podziękował : 2
Otrzymał podziękowań: 0
System operacyjny: Kubuntu
Kompilator: gcc
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Aplikacje sieciowe

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 1 gość