谁用过indy的IdTcpServer来处理数据?或做过socket通讯的高手看看!只剩这点分了,sorry ( 积分: 40 )

  • 主题发起人 主题发起人 wishme2
  • 开始时间 开始时间
W

wishme2

Unregistered / Unconfirmed
GUEST, unregistred user!
Socket接收到数据后,要对数据进行处理,然后应答发送方,请问IdTcpServer怎样
怎样实现下面的功能?

///流程:
IdTcpServer收到数据,建一新线程处理数据,然后将结果返回给发送方


type
TInitThread = class(TThread)
private
procedure ProData;
protected
procedure Execute; override;
end;

//上面定义线程

procedure TInitThread.Execute;
begin
FreeOnTermiNate:=True;
Synchronize(ProData);
end;

//上面是继承了Execute方法

procedure TInitThread.ProData;
begin
Screen.Cursor:=crHourGlass;
DealData;
Screen.Cursor:=crDefault;
end;

//上面是处理数据入口函数

Procedure DealData();
begin
....//在这里处理数据,并应答发送方
end;
//上面是处理数据,并应答


//从socket接收数据,并处理之
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
RcvMsg:string;
NewThread:TInitThread;
begin
RcvMsg := AThread.Connection.CurrentReadBuffer;
if RcvMsg<>'' then
NewThread:=TInitThread.Create(false); //这里接收的数据交到一个线程处理,处理完要应
//答给发送方,所以要代入AThread以区分要应答给谁
end;

//请问怎样让线程带入AThread参数,以便线程处理完数据后能通过AThread正确应答发送方?
//另外,上面每收到一次数据就create一次线程,要怎样销毁以便不会让线程太多而消耗资源?还是不用
//处理?
 
Socket接收到数据后,要对数据进行处理,然后应答发送方,请问IdTcpServer怎样
怎样实现下面的功能?

///流程:
IdTcpServer收到数据,建一新线程处理数据,然后将结果返回给发送方


type
TInitThread = class(TThread)
private
procedure ProData;
protected
procedure Execute; override;
end;

//上面定义线程

procedure TInitThread.Execute;
begin
FreeOnTermiNate:=True;
Synchronize(ProData);
end;

//上面是继承了Execute方法

procedure TInitThread.ProData;
begin
Screen.Cursor:=crHourGlass;
DealData;
Screen.Cursor:=crDefault;
end;

//上面是处理数据入口函数

Procedure DealData();
begin
....//在这里处理数据,并应答发送方
end;
//上面是处理数据,并应答


//从socket接收数据,并处理之
procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread);
var
RcvMsg:string;
NewThread:TInitThread;
begin
RcvMsg := AThread.Connection.CurrentReadBuffer;
if RcvMsg<>'' then
NewThread:=TInitThread.Create(false); //这里接收的数据交到一个线程处理,处理完要应
//答给发送方,所以要代入AThread以区分要应答给谁
end;

//请问怎样让线程带入AThread参数,以便线程处理完数据后能通过AThread正确应答发送方?
//另外,上面每收到一次数据就create一次线程,要怎样销毁以便不会让线程太多而消耗资源?还是不用
//处理?
 
var threadhandle,threadID:cardinal;

procedure TInitThread.ProData(athread:TIdPeerThread);
begin
...
end;

if RcvMsg<>'' then
begin
threadhandle:= CreateThread(nil, 0, @ProData, athread, 0, threadID);
CloseHandle(threadhandle);
end
 
这样做线程不安全。
而且本来indyServer就一个连接一个线程了。。现在又加个线程给他。。。能顶到1000个连接就简直是要Thanks god了
 
可以覆盖TThread的构造方法
type
TInitThread = class(TThread)
private
FIdPeerThread: TIdPeerThread;
procedure ProData;
protected
procedure Execute; override;
public
constructor Create(CreateSuspended: Boolean; AThead: TIdPeerThread);
end;
end;

constructor TInitThread.Create(CreateSuspended: Boolean; AThead: TIdPeerThread);
begin
inherited create(CreateSuspended);
FIdPeerThread := AThead;
end;
 
接受答案了.
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
后退
顶部