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
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.