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上没有数据过来,那么就不会执行NewThread:=TInitThread.Create(false);这句,也就不可能再把数组上剩的数据处理掉,这也是个问题
,难道要用定时器不成?那就没意义了吧
//能否只用一个线程专门来处理,而不要每次收到数据都create一个线程,该怎么改?
///流程:
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上没有数据过来,那么就不会执行NewThread:=TInitThread.Create(false);这句,也就不可能再把数组上剩的数据处理掉,这也是个问题
,难道要用定时器不成?那就没意义了吧
//能否只用一个线程专门来处理,而不要每次收到数据都create一个线程,该怎么改?
//这句话的意思是:如果数组上有数据没处理完,但socket上如果很长时间没有数据过来,就不会再执行create的那行代码,也就不可能再有机会处理数组上的数据,数组上剩余的数据将一直留到socket又有数据进来才会被处理,这也是个问题
不大的话可以用单线程处理当SOCKET收到数据时
1。检查线程是否已经创建
2。如果创建了就判断是否挂起,如果挂起,就运行它
3。如果没有创建就创建一个线程,然后运行它
4。线程处理数组中数据时可以循环处理完成后自动挂起如果采用多线程处理
还要一个线程专门监测数组中数据多少
如果大于临界值,则创建一个新的处理线程处理(或则把已经挂起的线程运行起来)
各线程处理完成后自动挂起
取数据时注意同步问题
var
s_recv:string;
begin
s_recv:=Socket1.recvdata;
if s_recv<>'' then //收到我的数据
begin
recvarray.add(s_recv);//加到公共数组上
NewThread:=TInitThread.Create(false);//创建线程来处理
end;
end;
建立连接后就创建线程, 让线程完成里里的内容, 包括接收数据。。不要只用一个 Socket来完成, 让每个线程都有自已的socket,并处理自已的RecvData 就可以了
使用indy, 简单一些
我现在用的就是indy,每个连接客户端都是一个线程,主要是数据量大,而且我处理数据的时候要对几个数据库操作,因此如果收到就处理是来不及的,我试过了
我想就是创建一个线程,收到数据时通知线程,但不知我的代码要怎么改一下
创建一个线程专门监视公用数组中的数据多少。
如果公用数组中数据超过一定数量,就将挂起的备用数据处理线程运行起来。
备用处理线程处理结束后自动挂起。