Pytanie: Co szukam jest najbardziej typowe lub najlepsze praktyki sposobem użycia oddzielnego wątku do odbierania danych przy użyciu IdTCPClient w Indy 10.Indy 10 IdTCPClient Czytanie danych przy użyciu osobnego wątku?
Tło: Poniższy kod jest próbka tego, co próbuję zrobić z rzeczywistymi częściami przetwarzania danych usuniętymi dla jasności. Idea wątku polega na otrzymywaniu wszystkich danych (zmienny rozmiar z nagłówkiem deklarującym resztę długości komunikatu), a następnie analizowanie go (to robi procedura HandleData) i wyzwalanie Event Handler w zależności od polecenia.
Gniazdo TIdIOHandlerSocket jest przekazywane do wątku przez główną aplikację, która również zapisuje dane w gnieździe, gdy jest to wymagane.
TScktReceiveThread = class(TThread)
private
{ Private declarations }
procedure HandleData;
protected
procedure Execute; override;
public
FSocket: TIdIOHandlerSocket;
constructor Create(CreateSuspended: boolean);
end;
procedure TScktReceiveThread.Execute;
var
FixedHeader: TBytes;
begin
Assert(FSocket <> nil, 'You must assign the connected socket to the receiving thread');
SetLength(FixedHeader, 2);
while not Terminated do
begin
if not FSocket.Connected then
Suspend
else
begin
FSocket.CheckForDataOnSource(10);
if not FSocket.InputBufferIsEmpty then
begin
FSocket.ReadBytes(FixedHeader, SizeOf(FixedHeader), false);
// Removed the rest of the reading and parsing code for clarity
Synchronize(HandleData);
end;
end;
end;
end;
jako przedrostek, użyłem innego pytanie StackOverflow która zajmuje się komponentów serwerowych Indy: „Delphi 2009, Indy 10, TIdTCPServer.OnExecute, how to grab all the bytes in the InputBuffer”, aby uzyskać podstawę tego, co mam do tej pory.
Dzięki za pomoc!
To jest pięknie eleganckie, ale czy opublikowałeś pełną implementację w dowolnym miejscu? Nie mogłem znaleźć pełnej implementacji klasy TMotileThreading w twoim poście. – jamiei
Dodałem moją implementację do odpowiedzi. – jpfollenius
Dziękuję Ci Smasher - nie pamiętam, dlaczego nie zaakceptowałem tego, kiedy pierwotnie pisałem, ale teraz jest akceptowany. ;) – jamiei