Soru: Aşağıdaki kod bir geçerli: Ne aradığım en tipik veya en iyi uygulama 10.Indy 10 IdTCPClient Ayrı bir iş parçacığı kullanarak veri okuma?
Arkaplan Indy bir IdTCPClient kullanarak veri almak için ayrı bir iş parçacığı kullanmak yoludur netlik için kaldırılan gerçek veri işleme parçaları ile ne yapmaya çalıştığımı örnek. İş Parçasının Fikri, tüm verileri (mesaj uzunluğunun geri kalanını bildiren bir başlık ile değişken boyut) almak ve daha sonra (HandleData prosedürünün yaptığı şey) ayrıştırmak ve komutuna bağlı olarak bir Olay İşleyicisini tetiklemektir.
TIdIOHandlerSocket, ana uygulama tarafından iş parçacığına geçirilir ve bu da veriyi gerektiği gibi sokete yazar.
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;
bir önek olarak Indy sunucu bileşenleri ile ilgilenen başka bir StackOverflow soru kullanmış: "Delphi 2009, Indy 10, TIdTCPServer.OnExecute, how to grab all the bytes in the InputBuffer" Ben bugüne kadar ne temelini olsun. Yardımlarınız için teşekkürler!
Bu çok zarif, ancak tüm uygulamayı istediğiniz yere gönderdiniz mi? Gönderinizde TMotileThreading sınıfının tam kullanımını bulamadım. – jamiei
Uygulamamı cevaba ekledim. – jpfollenius
Teşekkür ederim Smasher - Orijinal olarak yayınlandığında bunu neden kabul etmediğimi hatırlayamıyorum ama şimdi kabul edildi. ;) – jamiei