Thread mit ClientSocket?

Hallo!

Ich möchte einen Thread programmieren, welcher einen
TClientSocket enthält.
Der Thread soll einfach nur kurz laufen um ein paar
Daten von einem Server zu laden.

beispiel

TUpdThr = class(TThread)
private
DataTransmitted : Boolean;
CS : TClientSocket;
procedure CSError(…);
procedure CSRead(…);
procedure CSOnConnect(…);

procedure UpdateNow;
prcedure Execute;
public
constructor Create(Server : string);

destructor Destroy; override;
end;

constructor TUpdThr.Create(Server : string);
begin
inherited Create(FALSE);
CS := TClientSocket.Create(nil);

Hi Dennis,
die Execute-Methode deines Treads fehlt, dort solltest du die Sockets lesen.
Da die Event-Methoden im Thread liegen, kannst du dort IMHO keine Messagedlg zeigen, dieses müsstest du mittels der Methode
synchonize() durchführen,sonst gibts Konflikte mit dem Mainthread. In der Create() Methode müsstest Du als SELF den aufrufen Thread (Das Hauptprogramm) übergeben.

z.b.
TMySocketThread = Class(TThread)

procedure Execute;override;

MainForm= Class(TForm)

SocketThread: TMySocketThread;

in einer beliebigen Procedure:

SocketThread:= TMySocketThread.Create(Self);

Grüsse Mathias

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Mathias!

Vielen Dank erstmal für Deine Hilfe.
Ich hatte bereits eine Execute-Methode definiert, wollte nur aus Platzgründen nicht alles in diesen Artikel schreiben.

In meiner Hauptform (Form1) habe ich eine ButtonClick-Methode

procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(SELF);
end;

meine Unit mit dem Thread sieht wie folgt aus …
als host habe ich mit absicht „noname“ genommen, damit
der socket zwangsläufig in einen Fehler läuft, denn „noname“ gibt es nicht…

unit Unit2;

interface

uses classes, scktcomp, Dialogs;

type
TMyThread = class(TThread)
private
CS : TClientSocket;
DataTransmitted : Boolean;
procedure ShowMSG;
procedure CSError(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure Execute; override;
public
constructor Create(Owner : TComponent);
destructor Destroy; override;
end;

implementation

constructor TMyThread.Create;
begin
inherited Create(FALSE);
CS := TClientSocket.Create(Owner);
CS.ClientType := ctBlocking;
CS.OnError := CSError;
DataTransmitted := FALSE;
end;

procedure TMyThread.ShowMSG;
begin
ShowMessage(‚Error‘);
end;

procedure TMyThread.CSError;
begin
Synchronize(ShowMSG);
ErrorCode := 0;
DataTransmitted := TRUE;
Terminate;
end;

procedure TMyThread.Execute;
begin
CS.Host := ‚noname‘;
CS.Port := 3500;
CS.Active := TRUE;
repeat until Terminated or DataTransmitted;
CS.Active := FALSE;
end;

destructor TMyThread.Destroy;
begin
CS.Destroy;
inherited Destroy;
end;

end.

Tja, es funktioniert immer noch nicht.
Es kommt weiterhin eine ESocketError-Meldung und ShowMessage
wird auch nicht ausgeführt, was allerdings nicht so schlimm ist.
Ich habe das Gefühl, das die zugeordnete Methode für das Event
OnError einfach nicht ausgeführt wird.
Kann es sein, das Sockets, so ich wie ich sie verwenden möchte
nicht Thread-geeignet sind?

Weisst Du zufällig ob es dazu irgendwo im Netz Literatur oder
Beispiele gibt?

Falls es Dir eventuell weiterhelfen sollte :
ich benutze Delphi 4 Pro auf Win2K

Gruß Dennis

Hallo Mathias!

Vielen Dank erstmal für Deine Hilfe.
Ich hatte bereits eine Execute-Methode definiert, wollte nur
aus Platzgründen nicht alles in diesen Artikel schreiben.

In meiner Hauptform (Form1) habe ich eine ButtonClick-Methode

procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(SELF);
end;

meine Unit mit dem Thread sieht wie folgt aus …
als host habe ich mit absicht „noname“ genommen, damit
der socket zwangsläufig in einen Fehler läuft, denn „noname“
gibt es nicht…

Tja, es funktioniert immer noch nicht.

Es kommt weiterhin eine ESocketError-Meldung und ShowMessage
wird auch nicht ausgeführt, was allerdings nicht so schlimm
ist.
Ich habe das Gefühl, das die zugeordnete Methode für das Event
OnError einfach nicht ausgeführt wird.
Kann es sein, das Sockets, so ich wie ich sie verwenden möchte
nicht Thread-geeignet sind?

Weisst Du zufällig ob es dazu irgendwo im Netz Literatur oder
Beispiele gibt?

Falls es Dir eventuell weiterhelfen sollte :
ich benutze Delphi 4 Pro auf Win2K

Gruß Dennis

Hallo Dennis,
ich hab mir mal den Quelltext unter Delphi6/enterprise kompiliert und merkwürdigerweise bekomme ich nicht mal eine Fehlermeldung.
Die CS.Create-Methode wird aufgerufen, die Execute-Methode geht bis zum CS.active:= true (alternativ auch mal mit CS.Open() probiert) und nichts tut sich. I.d.R. sind diese conntections Thread-sicher - daran kann nicht liegen; da muß ich mal in meine schlauen Bücher schauen; empfehlen kann ich dir die Kochbücher zu Delphi & CO. z.b. Addison-Wesley „Delphi 4“ von Elmar Warken oder „Boland Delphi 5 Kochbuch“ vom Hanser-Verlag von Doberenz und Kowalski und die Handbücher von Delphi 6. Enterprise (ist aber ein bischen teuer). Im Netz findest du sicher was unter http://www.delphi3000.com.
grüsse Mathias

Hi Mathias!

Nochmals vielen Dank!

Aber wie Du auch siehst, nicht mal der Compiler
meckert rum. Der Code ist laut Delphi vollkommen in Ordnung,
funktioniert aber trotzdem nicht.
Ich hab mir gestern noch die Bücher „Delphi 6“ und „Delphi 6 nachschlagen und vertehen“ vom Addison Wesley Verlag bestellt.
Hab bis jetzt gute Erfahrungen mit Addison Wesley gemacht.

Dennis

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]