Avatar billede haandjern Nybegynder
21. december 2001 - 22:52 Der er 5 kommentarer og
1 løsning

MultiThreads

Jeg har et program, som man kan connecte til - men i dette tilfælde er der MANGE der connecter, og alle sammen connections skal have en ID, så jeg kan sende data til forskellige klienter...

Nogen ide om hvordan det fungere?
Avatar billede ziron Nybegynder
21. december 2001 - 22:55 #1
det kan du gøre med indy, der er også nogle eks.

/ZIRON
Avatar billede haandjern Nybegynder
21. december 2001 - 22:56 #2
Vil gerne have det lidt mere specifikiseret mht. metode teoretisk..
Avatar billede ziron Nybegynder
21. december 2001 - 22:58 #3
arrr okay, men prøv at se på det eks. jeg gider ikke at skrive lige nu...

/ZIRON
Avatar billede morten_s Nybegynder
22. december 2001 - 11:15 #4
Hvis du feks bruger standard ServerSocket som er med Delphi, så får hver
Client tildelt et nummer når de connecter til server Socketen.

Nedenstående kode sender f.eks til alle connections, så som du kan se
så har alle connections deres eget uniqe ID, det er så op til dig at holde
øje med hvem som er hvem, og evt tildele dem en tråd hver.


Var
i:integer;

begin
  for I := 0 to ServerSocket.Socket.ActiveConnections - 1 do
    ServerSocket.Socket.Connections[I].SendText(\'Hesten er citronblå \');
end;

Når du opretter din tråd skal du så føre en kopi af ServerSocket med over, i nedenstående
kan du se hvordan jeg opretter en tråd til at connecte til en serial enhed (det er ganske vist en indyclient men det kan du selv rette til.



her kaldets deklarationer:

private
    { Private declarations }
    procedure WriteState(State : Integer); reintroduce;
    procedure WriteStatus(Status : String);
    procedure WriteError(Error : String);

og her selve kaldet:

if not IdTCPClient.Connected then
  begin
    With TLogOnController.Create do
    begin
      OnStateEvent := WriteState;
      OnStatusEvent := WriteStatus;
      OnErrorEvent := WriteError;
      OnControllerConnectedEvent := WriteControllerConnect;
      IPNo := //\'Dit IP\';
      Port := //Din port;
      FClientSocket := IdTCPClient;
      WriteDelay := 0;
      resume;
    end;
  end else
    IdTCPClient.Disconnect;




Og her tråden:

unit tLogOn;

interface

uses
  Classes, Dialogs, Controls, SysUtils, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient;

type
  TStateEvent  = procedure(State : Integer) of object;
  TStatusEvent  = procedure(Status : String) of object;
  TErrorEvent  = procedure(Error : String) of object;
  TConnectEvent = procedure(ControllerConnected : Boolean) of object;
  TLogOnController = class (TThread)
  private
    FOnStateEvent : TStateEvent;
    FOnStatusEvent : TStatusEvent;
    FOnErrorEvent : TErrorEvent;
    FOnConnectEvent : TConnectEvent;
    procedure SetOnStateEvent(const Value: TStateEvent);
    procedure SetOnStatusEvent(const Value: TStatusEvent);
    procedure SetOnErrorEvent(const Value: TErrorEvent);
    procedure SetOnConnectEvent(const Value: TConnectEvent);
  protected
    procedure Execute; override;
  public
    FClientSocket : TIdTCPClient;
    IPNo : String;
    Port : Integer;
    WriteDelay : Integer;
    Constructor Create;
    Destructor Destroy; override;
    property OnStateEvent : TStateEvent read FOnStateEvent write SetOnStateEvent;
    property OnStatusEvent : TStatusEvent read FOnStatusEvent write SetOnStatusEvent;
    property OnErrorEvent : TStatusEvent read FOnStatusEvent write SetOnStatusEvent;
    property OnControllerConnectedEvent : TConnectEvent read FOnConnectEvent write SetOnConnectEvent;
  end;

implementation


var
  InStr : String;
  State : Integer;
{ TDataopsamling }

constructor TLogOnController.Create;
begin
  inherited Create(true);
  FreeOnTerminate := false;
end;


destructor TLogOnController.Destroy;
begin
  inherited;
end;

procedure TLogOnController.execute;
var
  TmpStr : String;
  //i : Integer;
begin
  inherited;
  FOnConnectEvent(False);
  FOnStateEvent(1);
  FOnStatusEvent(\'Trying to connect: Ip \'+IPNo+\':\'+IntToStr(Port));
  FClientSocket.Host := IPNo;
  FClientSocket.Port := Port;
  FClientSocket.Connect;
  if not FClientSocket.Connected then
  begin
    FOnErrorEvent(\'Could not connect to: Ip \'+IPNo+\':\'+IntToStr(Port));
    Exit;
  end;
  Sleep(WriteDelay);
  FClientSocket.Write(#27);
  FOnStateEvent(2);
  FOnStatusEvent(\'Handshaking....\');
  InStr :=  FClientSocket.ReadLn(\'> \', -2);
  FOnStateEvent(3);
  FOnStatusEvent(\'Connected to: Ip \'+IPNo+\':\'+IntToStr(Port));
  if FClientSocket.Connected then
    FOnConnectEvent(True)
  else
    FOnConnectEvent(False);
end;

procedure TLogOnController.SetOnStateEvent(const Value: TStateEvent);
begin
  FOnStateEvent := Value;
end;

procedure TLogOnController.SetOnStatusEvent(const Value: TStatusEvent);
begin
  FOnStatusEvent := Value;
end;

procedure TLogOnController.SetOnErrorEvent(const Value: TErrorEvent);
begin
  FOnErrorEvent := Value;
end;

procedure TLogOnController.SetOnConnectEvent(const Value: TConnectEvent);
begin
  FOnConnectEvent := Value;
end;

end.
Avatar billede haandjern Nybegynder
22. december 2001 - 18:56 #5
Takker mange gange :)
Avatar billede haandjern Nybegynder
23. december 2001 - 21:36 #6
morten_s: jeg kører lidt rundt i det endnu - kan du evt. sende et grafisk eksempel til min e-mail?
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester