Komunikacja z urządzeniem przez TCP

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.

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.

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

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.

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.

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

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