再问一次这个问题,我的多线程做法是否有问题,高手帮我看看 ( 积分: 24 )

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

wishme

Unregistered / Unconfirmed
GUEST, unregistred user!
Socket接收到数据后,要对数据进行处理,如下我的流程是否有问题?
///流程:
public
recvarray:TstringList;//用来把收到的数据先添加到这个数组上,然后创建线程来处理数组

type
TInitThread = class(TThread)
private
procedure ProData; //数据处理
protected
procedure Execute; override;//重载
public
constructor Create();//构造函数
end;

//上面定义线程
constructor TInitThread.Create;
begin
inherited Create(false);
FreeOnTerminate:=true;
end;

procedure TInitThread.Execute;
begin
Synchronize(ProData);
end;

//上面是继承了Execute方法

procedure TInitThread.ProData;
begin
//这里处理数组recvarray上的数据
end;


//从socket接收数据,并处理之
procedure TForm1.RecvData;
var
s_recv:string;
begin
s_recv:=Socket1.recvdata;
if s_recv<>'' then //收到我的数据
begin
recvarray.add(s_recv);//加到公共数组上
NewThread:=TInitThread.Create(false);//创建线程来处理
end;
end;

//上面每收到一次数据就create一次线程,没有问题吧

//如果数组上有数据没处理完,但socket上如果很长时间没有数据过来,就不会再执行create的那行代码,也就不可能再有机会处理数组上的数据,数组上剩余的数据将一直留到socket又有数据进来才会被处理,这也是个问题,难道要用定时器不成?那就没意义了吧

//能否只用一个线程专门来处理,而不要每次收到数据都create一个线程,该怎么改?
 
Socket接收到数据后,要对数据进行处理,如下我的流程是否有问题?
///流程:
public
recvarray:TstringList;//用来把收到的数据先添加到这个数组上,然后创建线程来处理数组

type
TInitThread = class(TThread)
private
procedure ProData; //数据处理
protected
procedure Execute; override;//重载
public
constructor Create();//构造函数
end;

//上面定义线程
constructor TInitThread.Create;
begin
inherited Create(false);
FreeOnTerminate:=true;
end;

procedure TInitThread.Execute;
begin
Synchronize(ProData);
end;

//上面是继承了Execute方法

procedure TInitThread.ProData;
begin
//这里处理数组recvarray上的数据
end;


//从socket接收数据,并处理之
procedure TForm1.RecvData;
var
s_recv:string;
begin
s_recv:=Socket1.recvdata;
if s_recv<>'' then //收到我的数据
begin
recvarray.add(s_recv);//加到公共数组上
NewThread:=TInitThread.Create(false);//创建线程来处理
end;
end;

//上面每收到一次数据就create一次线程,没有问题吧

//如果数组上有数据没处理完,但socket上如果很长时间没有数据过来,就不会再执行create的那行代码,也就不可能再有机会处理数组上的数据,数组上剩余的数据将一直留到socket又有数据进来才会被处理,这也是个问题,难道要用定时器不成?那就没意义了吧

//能否只用一个线程专门来处理,而不要每次收到数据都create一个线程,该怎么改?
 
帮我一下
 
你最好是将recvarray数组传到线程里面来处理,不然你这样做,还不等于是一个线程?
 
后退
顶部