Witam,
Od jakiegoś czasu tworzę serwer który ma za zadanie odbierać połączenie od klienta i sprawdzać wszystkie dane jakie są do niego wysyłane z danymi w bazie danych. Program napisałem w oparciu o TSockety, ponieważ program jest dość duży opisze w skrócie jak działa.
Utworzyłem własną klasę TThread w której są przechowywane dane połączonego klienta.
W TServerSocket OnConnection dałem tworzenie nowego wątku (przechowywane w array of TMojWatek), kiedy łączy się nowy klient szukam pustego miejsca (nil) lub zwiekszam arraya o 1 tworze wątek i zapisuję do niego wszystkie potrzebne dane. Kiedy klient wysyła dane, odbieram go poprzez OnRead i wysyłam do odpowiedniego wątku (szukam go poprzez sockethandle). Na końcu jest jeszcze OnDisconnect i OnError które usuwają wątek z arraya (ustawiają na nil).
Całość działa poprawnie, dla pojedynczych połączeń, powiedzmy 3-4 poł. na sek. I nawet przy 140 połączeniach program działa poprawnie. Niestety problem zaczyna się gdy łączy się kilkanaście klientów na sek. Robi się "bajzel" i bo kilku sek albo wyrzucane są błędy albo program po prostu się zamyka.
Chciałem użyć threadBlocking tak żeby każde połączenie do serwera było wykonywane niezależnie ale niestety nie znalazłem żadnego arytkułu ani przykładu jak wykorzystać threadblocking oraz moje własne wątki. Wszystko co znalazłem to były tylko ogólne zastosowanie ale 0 konkretów z wykorzystaniem tego we własnych wątkach.
Jeśli ktoś wie jak używać threadBlocking w TServerSocket w połączeniu z własnym wątkiem to bardzo mi to pomoże.
Osobiscie myślałem o czymś takim:
type
TMojWatek = class(TThread)
ClientSocket = ^TServerClientThread;
{ ... reszta deklaracji itp...}
end;
procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket; var SocketThread: TServerClientThread);
var
Watek: TMojWatek;
begin
Watek:=TMojWatek.Create(false);
Watek.ClientSocket := @SocketThread;
{no właśnie i co dalej?!}
end;
tu się zaczyna problem jak odbierać dane od klienta i jak dalej wykonywać zadania które są w wątku tzn. odczytaj dane - sprawdź w bazie danych - wyślij odpowiedz.
Wszelka pomoc mile widziana.