2011-12-02 10 views
5

Mam aplikacji Delphi 6, która używa zestawu składników ICS do komunikacji gniazda. Posiadam własny komponent VCL gniazda serwera, który tworzy gniazda TWSocket klienta po udostępnieniu nowej sesji. Utworzone przeze mnie gniazda klienta mają właściwość Multithreaded ustawioną na wartość TRUE, ale wszystko to zmienia sposób, w jaki gniazdo klienta obsługuje komunikaty gniazda, w sposób bezpieczny z wątku tła (poza głównym wątkiem VCL). TWSocket nie odradza się wątek do obsługi ruchu danych gniazda, który jest tym, czego potrzebuję.Jak mogę przekazać zdarzenie OnDataAvailable() TWSocket do wątku tła w mojej aplikacji Delphi 6?

Potrzebuję, aby połączenia odbierane były odbierane z głównego wątku VCL, głównego wątku interfejsu użytkownika, ponieważ przychodzące dane do gniazda klienta to dane audio, które muszą zostać przetworzone szybko, w czasie 50-100 milisekund lub krótszym. Innymi słowy, jedna czkawka na głównym wątku VCL i strumień audio są zakłócone. Właśnie dlatego chcę nacisnąć zdarzenie OnDataAvailable(), które uruchamia się, gdy dane przychodzące są dostępne dla wątku o wysokim priorytecie. Innymi słowy, chcę wymusić pętlę przetwarzania komunikatów należącą do klienta TWSocket na wątek tła.

Wierzę, że mogę to zrobić, tworząc gniazdo klienta za pośrednictwem wątku w tle, ale mam nadzieję, że uniknę tego, ponieważ obecnie używam komponentu VCL, który stał się serwerem gniazd. Jest to jednostka, która akceptuje połączenie przychodzące i odradza gniazda klienta. Serwer gniazd jest tworzony w głównym wątku VCL.

W związku z tym moje pytanie brzmi, czy istnieje (stosunkowo) łatwy sposób na tworzenie gniazd klienta, aby używać istniejącego wątku tła do przetwarzania ich gniazda, w szczególności obsługi wiadomości FD_RECV? Jeśli nie jest istniejącym wątkiem tła, utworzę go dla każdego tworzonego przeze mnie gniazda klienta, ale muszę wiedzieć, jak upewnić się, że nowy obiekt TWSocket używa tego wątku tła, gdy uruchamia swoją pętlę komunikatów, która przetwarza komunikaty gniazda, więc w jaki sposób Robię to?

+2

Czy to musi być ICS? Indy i Synapse są bardzo łatwe w użyciu z wątkami i nie zależą od "wąskiego gardła" kolejki zdarzeń systemu Windows. – mjn

+0

@mjn. Czy możesz rozwinąć "wąskie gardło kolejki zdarzeń"? Co Indy/Synapse robi inaczej, jeśli chodzi o przetwarzanie komunikatów gniazda O/S, które go otaczają? –

+2

@RobertOschler: Indy w ogóle nie używa komunikatów gniazda. Wszystkie gniazda są używane w trybie blokowania. ICS zamiast tego korzysta z nieblokujących gniazd. –

Odpowiedz

3

Dla innych użytkowników ICS/TWSocket, rozwiązanie znajduje się w projekcie demonstracyjnym ICS ThrdSrv dołączonym do pakietu. Przyjrzyj się bliżej temu projektowi, a zwłaszcza jego zastosowaniu metod ThreadAttach() i ThreadDetach(). Ten przykładowy projekt pokazuje, jak tworzyć gniazda klienta, które mają pompy komunikatów uruchamiane w kontekście wątku roboczego.

Powiązane problemy