Avatar billede loke-liscom Nybegynder
03. september 2002 - 09:56 Der er 4 kommentarer og
2 løsninger

StThreadBlocking

Jeg har lige endnu et spørgsmål.
Når jeg laver serverobjecter laver jeg dem altid stNonBlocking, da jeg aldrig har fået stThreadBlocking til helt at virke.

Jeg nedarver typen TSocketThread og laver en ecectute. Det hele virker meget fint men jeg modtager bare ikke noget fra Socket'en.
Er det noget med at man skal "streame" dataen ned?

/klaus
Avatar billede loke-liscom Nybegynder
03. september 2002 - 17:05 #1
Jeg vil godt tilføje lidt til dette spørgsmål.
Hvilken metode er den bedste/mest korrekte NonBlocking eller ThreadBlocking?
Avatar billede morten_s Nybegynder
04. september 2002 - 12:57 #2
Hvis du har en veldifineret protokolstruktur på de data som du skal modtage er det min erfaring at det giver færrest problemmer at kører blocked, brug de medfølgende IndyCompnenter

Et eksempel på en tråd til dataopsamling som kører blocked:


unit tConnect;


interface

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

type
  TConnectClient = class (TThread)
  private
    OnConnect: Boolean;
    OnStatus: String;
    OnError: String;
    procedure SetOnConnectEvent;
    procedure SetOnStatusEvent;
    procedure SetOnErrorEvent;
  protected
    procedure Execute; override;
  public
    ClientSocket : TIdTCPClient;
    IPNo : String;
    Port : Integer;
    Node: Integer;
    TlfNr : String;
    WriteDelay : Integer;
    ResponseTime : Integer;
    TickStart: Integer;
    Constructor Create;
    Destructor Destroy; override;
  end;

implementation

uses uFalcoData, uComStatus;

constructor TConnectClient.Create;
begin
  inherited Create(true);
  FreeOnTerminate := True;
end;


destructor TConnectClient.Destroy;
begin
  inherited;
end;

procedure TConnectClient.Execute;

var
  InStr: String;
begin
  inherited;
  OnStatus:= 'IpNo: ' + IPNo+':'+IntToStr(Port)+ ' Trying to connect socket....';
  Synchronize(SetOnStatusEvent);
  OnConnect := False;
  ClientSocket.Host:= IPNo;
  ClientSocket.Port:= Port;
  ClientSocket.Tag:= TickStart;
  try
    ClientSocket.Connect;
  except
    on E: Exception do
    begin
      OnError:='IpNo: ' + IPNo+':'+IntToStr(Port)+ ' Error on connect: '+E.Message;
      Synchronize(SetOnErrorEvent);
      Exit;
    end;
  end;
  if ClientSocket.Connected then
  try
    begin
    OnStatus:= 'IpNo: ' + IPNo+':'+IntToStr(Port)+ ' Connected to socket';
    Synchronize(SetOnStatusEvent);
    Sleep(WriteDelay);
    {if TlfNr <> '' then
    begin
      ClientSocket.Write('PSTN'+TlfNr+'END');
      InStr :=  ClientSocket.ReadLn('>',120000);
      if ClientSocket.ReadLnTimedOut then
      begin
        OnError:= 'IpNo: ' +  IPNo+':'+IntToStr(Port) + ' Time out, modem';
        Synchronize(SetOnErrorEvent);
        Exit;
      end;
      if (pos(#2, InStr) > 0) and (pos(#3, InStr) > 0) then
      begin
        OnError:= 'IpNo: ' +  IPNo+':'+IntToStr(Port) + ' Modem error: '+InStr;
        Synchronize(SetOnErrorEvent);
        Exit;
      end;
    end;}
    ClientSocket.Write(#27);
    OnStatus:= 'IpNo: ' +  IPNo+':'+IntToStr(Port) + ' Handshaking controller';
    Synchronize(SetOnStatusEvent);
    InStr :=  ClientSocket.ReadLn('>',ResponseTime);
    if ClientSocket.ReadLnTimedOut then
    begin
      OnError:= 'IpNo: ' +  IPNo+':'+IntToStr(Port) + ' Time out, handshaking controller';
      Synchronize(SetOnErrorEvent);
      Exit;
    end;
    Sleep(WriteDelay);
    ClientSocket.Write('remote0 '+#13);
    InStr := ClientSocket.ReadLn('remote0 '+#13+#10+'0'+#13+#10+'>'+#13+#10+'> ', ResponseTime);
    if ClientSocket.ReadLnTimedOut then
    begin
      OnError:= 'IpNo: ' +  IPNo+':'+IntToStr(Port) + ' Time out, controller init';
      Synchronize(SetOnErrorEvent);
      Exit;
    end;
  end;
    OnStatus := 'IpNo: ' + IPNo+':'+IntToStr(Port)+ ' Connection ready for communication';
    Synchronize(SetOnStatusEvent);
    OnConnect:= True;
    Synchronize(SetOnConnectEvent);
  except
    on E: Exception do
    begin
      OnError:= 'IpNo: ' +  IPNo+':'+IntToStr(Port) + ' Error: ' + E.Message;
      Synchronize(SetOnErrorEvent);
    end;
  end;
end;


procedure TConnectClient.SetOnConnectEvent;
begin
  dlgComStatus.WriteClientConnected(OnConnect, TickStart);
end;

procedure TConnectClient.SetOnErrorEvent;
begin
  dlgComStatus.WriteConError(IPNo, OnError, Node, Port, TickStart);
end;

procedure TConnectClient.SetOnStatusEvent;
begin
  dlgComStatus.WriteConStatus(OnStatus);
end;

end.
Avatar billede loke-liscom Nybegynder
05. september 2002 - 12:11 #3
Der er jo ingen der gidder at svare på mit spørgsmål så jeg giver halvdelen af pointene til dig morten og tager halvdelen tilbage
Avatar billede loke-liscom Nybegynder
05. september 2002 - 12:12 #4
Morten, jeg håber at det er okay med dig....
Avatar billede morten_s Nybegynder
05. september 2002 - 15:24 #5
Jeg håber da du kan bruge mit svar til noget ?
Avatar billede loke-liscom Nybegynder
06. september 2002 - 11:15 #6
Jo, tak det kunne jeg godt!!!
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