Komunikacja z urządzeniem przez TCP

Komunikacja z urządzeniem przez TCP
AM
  • Rejestracja: dni
  • Ostatnio: dni
0

Część,

Potrzebuję małej podpowiedzi.
Mam urządzenie które podłączone jest po LANie. Komunikacja protokół TCP.
Do niego mogę wysyłać dane, ale też dostaje informację zwrotną. I o ile pytanie/odpowiedź działa. To są sytuacje, gdy urządzenie samo od siebie może coś wysłać, jako informację o wystąpieniu zdarzenia.

Próbowałem to garnąć poprzez komponent TcpClient i TIdTCPClient. I mam problem z nasłuchem gdy ja nic nie muszę wysyłać, a na urządzeniu coś wystąpi i zwraca jakieś dane.

Kopiuj
TTcpClient.IOHandler.ReadStream( myInStream );

powoduje mi zamrożenie aplikacji, a chodzi mi o sprawdzenie czy są dane jeżeli tak to odczycie, a jeżeli nie ma to chciałbym wrócić do głównego zadania. Jak to ogarnąć? Z góry dzięki za podpowiedzi.

cerrato
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Poznań
  • Postów: 9018
1

Pytanie, czy musisz działać w oparciu o Indy? Lepszą opcją jest Synapse - http://www.ararat.cz/synapse/doku.php/start. Wprawdzie nie rozwiązuje to wprost Twojego problemu, ale może być przydatną porada ;)

PW
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 130
1

Ja ze swojej strony mogę polecić ICS overbyte znacznie więcej możliwości konfiguracji stosu tcp i super stabilne i przewidywalne.
Synapse też są bardzo dobre.

KA
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Gorlice
2

Jeżeli chodzi o rozwiązanie na TIdTCPClient to wątek w nim pętla while not Terminated do tam sprawdzasz czy masz coś do odczytania czyli IdTCPClient1.IOHandler.InputBuffer.Size > 0 Jak są dane to odczytujesz także w wątku możesz tam sobie zsynchronizować jakieś zdarzenie tylko oczywiście przez tradycyjne Synchronize albo TThread.Queue(nil, procedure begin {tu wywołujesz zdarzenie} end);. Żadna filozofia.

SP
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 127
0
amidar napisał(a):

(...)
powoduje mi zamrożenie aplikacji, a chodzi mi o sprawdzenie czy są dane jeżeli tak to odczycie, a jeżeli nie ma to chciałbym wrócić do głównego zadania. Jak to ogarnąć? Z góry dzięki za podpowiedzi.

Jeśli tak, to musisz ustawić gniazdo na pracę w trybie nieblokującym

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.