AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Anfängerfrage: Non Blocking TCP Client in einem Thread
Thema durchsuchen
Ansicht
Themen-Optionen

Anfängerfrage: Non Blocking TCP Client in einem Thread

Ein Thema von alzaimar · begonnen am 4. Dez 2009 · letzter Beitrag vom 7. Dez 2009
 
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#1

Anfängerfrage: Non Blocking TCP Client in einem Thread

  Alt 4. Dez 2009, 15:40
Moin

Jahaaa, auch Moderatoren sind manchmal richtige Deppen. So wie ich.

Ich muss eine Anwendung fertigstellen, in der ein Thread mit einem TCP-Server kommuniziert. Ich möchte diese Änderungen minimalinvasiv gestalten, d.h. vorhandene Klassen nur austauschen und ganz wenig am Code verändern.

Folgender Code bereitet mir Bauchschmerzen:

Hier der Code des Kommunikationsthreads:
Delphi-Quellcode:
Type
  TComThread = Class (TThread)
  Private
     fSocket : TClientSocket;
  ...
  Public
     Procedure SendData (Const Data : String);
     Property OnDataReceived : TDataReceivedEvent...;
  End;

Procedure TComThread.SendData (Const Data : String);
Begin
  AddDataToOutputQueue(Data)
End;

Procedue TComThread.Execute;
  Procedure WaitForSocketConnected;
  Begin
    Repeat until Timeout or fSocketConnected;
  End;

Begin
  fSocket := TClientSocket.Create(nil);
  fSocket.ClientType := ctNonBlocking;
  fSocket.OnConnected := SocketConnected;
  fSocket.OnRead := ReadDataFromSocket;
  ...
  fSocket.Connect;
  Synchronize (WaitForSocketConnected); // <--- hä? klappt aber nur so

  While not Terminated And fSocketconnected Do
    If DataToSendAvailable Then SendNextChunkOfData;

  fSocket.Free;
End;
Der Thread verwaltet eine Queue, in der andere Threads ihre Daten reinpacken, die verschickt werden sollen.
Der Thread hat einen Event, der gefeuert wird, wenn Daten angekommen sind.

Das Teil hängt sich manchmal auf und ich vermute, das das an diesem komischen Synchronize liegt. Außerdem ist das irgendwie uncool.

Meine Frage lautet nun:
Wie macht man das richtig?
Wie verwendet man einen Non-Blocking Socket in einem Thread? Gibt es irgendwo Codebeispiele?

Oder gibt es bessere/einfachere Lösungen?

Wie gesagt, wichtig ist mir nur das Interface des Threads (SendData, OnDataReceived) und das das Senddata den Aufrufer nicht blockiert.

Da ich bestimmt den Wald vor lauter Bäumen nicht sehe, bin ich gerne bereit, mich auslachen zu lassen.
Oder mit Torten beschmeißen.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz