Asynchroniczne wykonywanie kodu, Sockety

0

Heja

Jak to jest z pracą z komponentem TServerSocket w trybie NonBlocking. Z tego co mi się wydaje, że jest to praca asynchroniczna, do której nie są angażowane żadne wątki poboczne.

Jakie są mechanizmy dostarczane z Delphi, aby sobie taką pracę poukładać. Jest sobie powiedzmy jakieś zapytanko do bazy, które ma się wykonać w odpowiedzi na jakiś pakiet przesłany od klienta, i jak zagwarantować, że procedura opakowująca to zapytanie, zostanie wykonana w całości - tzn. nic tego wykonania nie przerwie ? Próbowałem sekcji krytycznych, ale nie działają - wniosek z tego taki, że wszystko leci w wątku głównym, ale efekt jest taki, że jak mam połączenie od dwóch klientów to w jakiś sposób wykonuje się kod od obu klientów jednocześnie - albo inaczej to ujmując podczas gdy się wykonuje kod z tytułu pierwszego połączenia, nagle zaczyna się wykonywać kod z tytułu drugiego połączenia. Próbowałem też użyć semaforów z licznikiem = 1, ale tak samo nie zdały rezultatu co utwierdziło mnie w przekonaniu, że w tym trybie pracy nie biorą udziału inne wątki.

Czyli reasumując, temat w uproszczeniu wygląda tak: jest sobie serversocket (nonblocking) po odebraniu sygnału z pierwszego połączenia wchodzi do procki która pare chiwl mieli cos na bazie danych, i w tym czasie przychodzi sygnał z drugiego połączenia, więc tamto mielenie jest przerywane i na pierwszy plan wchodzi mielenie z tytułu drugiego połączenia.

Faktem jest, że w procedurze "mielącej", gdzieś tam na boku wyświetlam postęp. A co za tym idzie wywołuje ProcessMessages - czy to przez to są takie przerwania (obstawiam, że tak - zaraz sprawdze) ? W każdym razie wywalenie ProcessMessages, owocuje wiadomo czym.

Wiem że jest jeszcze opcja, tworzenia wątku dla każdego przychodzącego połączenia, jednak z pewnych względów z niej zrezygnowałem (większość projektu mam już pokodowanego, trochę goni czas a wcześniej tego nie robiłem itd itp) - dlatego chciałbym to zrobić na NonBlocking.

Jedyne co mi przychodzi do głowy to zrobienie jakiegoś mechanizmu kolejkowania zadań, i wykonywania ich po kolei. Czyli program po odebraniu sygnału od klienta, wrzuca zadanko do kolejki. A potem co jakiś czas, przelatuję kolejeczkę, i robię jedno za drugim.

Z góry dziękuję za sugestie
Pozdrawiam

0

a nie lepiej to rozwiązać w ten sposób http://duketown.com/marcel/server.shtml

0

Dzięki za linka. na razie wywaliłem Application.ProcessMessages i chula. Jak czas pozwoli ... to pokuszę się o model wielowątkowy.

Pozdrawiam

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