Indy 9 - Wyłapywanie wyjątków przy awarii serwera

0

Witam!

Ostatnio ucząc się delphi i korzystając z komponentów Indy 9 natknąłem się na problem z wyłapaniem wyjątku(w aplikacji klient) przy "zaniku" serwera, np. gdy wystąpi wyjątek(po stronie serwera). Najczęściej wyjątek brzmi "Software caused connection abort" i go da się wyłapać, jednak zdarzały się również o niekończące się serie komunikatów o błędzie wyłapywane przez debuger na Application.Run z pustym callstackiem, więc jak wyłapać takie wyjątki. Dodatkowo mam jeszcze kilka pytań co do używania komponentów IdTCPClient i IdTCPServer

  1. czy jest jakaś inna metoda na odbieranie danych po stronie klienta poza Aktywnym przesłuchiwaniem w Timerze
  2. czy da się usunąć/zniwelować freezy podczas łączenia z brakiem serwera przy użyciu gotowych komponentów Indy(z wielowątkowością poza sobie radzę)
  3. Czy stosowanie mechanizmu komend wbudowanych w serwer ma sens przy intensywnej komunikacji obustronnej, czy lepiej zaimplementować własny mechanizm
0
  1. to co się dzieje przy debugowaniu a co się dzieje przy uruchomieniu release to dwie różne rzeczy. Co oczywiście nie zmienia faktu, że prawie wszystkie wyjątki można wyłapać i obsłużyć
  2. nie wiem co to jest Aktywnym przesłuchiwaniem w Timerze ale normalni ludzie korzystają ze zdarzeń np. `OnRead'
  3. co to jest/są freezy?
  4. jakieś konkrety - jakie komendy wbudowane, OCB w ogóle...
0

1.Eventy...
2.'Freezy' właśnie zredukujesz wątkiem (niestety nie rozumiem co chciałeś powiedzieć w nawiasie, nie, nie ma innego wyjścia).
3.Jeżeli to jest dobry mechanizm, to jest dobry, a jeżeli jest zły, to i tak lepszego nie zrobisz...

0

Dziękuję za zainteresowanie.
@Misiekd
Ad.0 No właśnie chodzi o to, że takie "dziwne" wyjątki latały i pod debugerem i w release.
Ad.1 Niestety nie widzę, żadnego eventy w IdTCPClient, nawet w przykładzie chatu publikowanym jako demo dla IdTCPClient i Server użyty był Timer. Jeśli jednak jest odpowiedni event od tego(może inny komponent), to jak on się nazywa?
Ad.2 freezy czyli zmrożenia - zablokowania/krótkotrwałe zapętlenia programu(np. podczas oczekiwania na połączenie z serwerem)
Ad.3 Nie znam zbyt dobrze tej biblioteki i dlatego się pytam. Wydaje mi się, że maja one zastosowanie tylko w przypadku komunikacji w stylu Klient----polecenie--->Serwer----odpowiedź---->Klient, ale może się mylę.

@NieSynaptyczny
Ad.2 Tak też myślałem, jednak w Indy jest kilka komponentów od obsługi wielowątkowości i myślałem, że któryś z nich odwali za mnie całą robotę.
Ad.3 To, że uczę się delphi, poznaję bibliotekę Indy, to nie znaczy, że nie mam doświadczenia w programowaniu i algorytmice.

Prosiłbym aby wypowiadały się osoby, które używały/używają tej biblioteki.

0
  1. nie ma "dziwnych" wyjątków - każdy wyjątek coś powoduje. A na pytanie "jak pozbyć się dziwnych wyjątków" to możesz jedynie dostać odpowiedź w stylu "popraw program"
  2. OnWork może wystarczy.
  3. po angielsku freeze, po polsku np. zawieszanie, zamrażanie (frezy to całkiem co innego). Przestańcie pisać dziwne zlepki angielsko-polskie!!! A wracając do tematu to od tego jest idantyfreeze (który działa tak sobie) albo wątki
  4. dalej nic z Twojego opisu nie wynika. W samo TCP nie ma żadnych "wbudowanych komend". BTW komunikacja C-S chyba właśnie polega na tym, że jedno coś wysyła do drugiego i to drugie odpowiada

BTW indy to taki sobie wybór. Niby jest asynchroniczne, ma jakieś wynalazki w stylu idantifreeze ale tak naprawdę jak chcesz aby nie blokowało aplikacji to trzeba to wstawić w wątek. Masz jeszcze ICS, synapse. O ile ICS jest trochę podobne do indy to z synapse trzeba napisać trochę więcej własnego kodu ale za to możesz z tym robić co Ci się żywnie podoba

0

Dzięki za pomoc.
0. Problem tego "dziwnego" wyjątku leżał po stronie wątku odpowiedzialnego za obsługę prezentacji SWF, który korzystał z obiektu IdTCPClient, a debuger zwyczajnie nie wyłapywał tego wyjątku.

  1. Niestety OnWork nie działa, gdzieś czytałem, że jest on używany przy przesyłaniu danych strumieniowo(w sensie zapis do strumienia). Zauważyłem, że można do Klienta podpiąć "IOHandler", tylko też nie za bardzo wiem, jak ich użyć. W tym projekcie zmodyfikowałem bibliotekę, bo jak się okazało wszystko w tym celu jest, ale nie ma eventa(w indy 10 podobno już jest)
  2. A ja do chwili przeczytania twojego postu byłem pewien, że zamrażać to freez, a swoją drogą jeśli już stosować takie zlepki to powinienem napisać chociażby tak: freez'y, z najlepiej zamrożenia
  3. chodziło mi o te komendy, które udostępnia komponent IdTCPServer, ale po przyjrzeniu się im dokładniej okazało się, że ślą dość długie ramki danych(serializowana klasa) i są wolniejsze od tego co napisałem na szybko(prosta maszyna stanów). Całość będzie pracować pod dużym obciążeniem, a klienci będą łączyć się przez modem GPRS(w sensie transmisja danych przez sieć komórkową ogólnie nie tylko standard GPRS).

Skorzystałem z Indy bo program miał powstać w zaledwie 4 dni, ale będzie rozwijany. Najpierw powstanie program zaspokajający wszystkie potrzeby, a potem przepiszę go używając tylko WinAPI(żadnych Indy, vcl, czy innych bibliotek). Teraz pierwsze tablety z win 7 i moim cudem na pokładzie(Oczywiście samoaktualizacja w tle jest zaimplementowana) pojechały do ludzi i pierwsze dane przeszły już przez sieć. A tak na marginesie chwaliłem się, że mam 14 lat?
Jeszcze raz dzięki za pomoc,w przyszłych projektach na pewno nie użyję już Indy.

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