从socket上不停接收数据然后创建线程来处理,做法如下type //先声明TThread类
TInitThread = class(TThread)
protected
procedure Execute; override;
public
constructor Create;
end;
var
NewThread: TInitThread; //声明线程对象
implementationconstructor TInitThread.Create;
begin
inherited Create(FALSE); //Createsuspended = false
FreeOnTermiNate := True;
end;procedure TInitThread.Execute; //重载execute
begin
Synchronize(DealData);
end;
procedure DealData();
begin
//处理signlist上数据,这里有查数据库,并需要较长时间
end;Procedure TForm1.SocketRecv(); //在这里接收socket的数据
begin
GLogCS.Enter; //这是线程同步:GLogCS: TCriticalSection;
signlist.Add(recvstr);//把收到的数据先添加到一个string数组上
GLogCS.Leave;
NewThread := TInitThread.Create; //创建新线程
end;我的问题是:
1、我的这种做发有问题吗?
2、在接收数据时,数据量很大,不停有数据进来,那我就不停的:
NewThread := TInitThread.Create;
这样总好象处理不过来,因为数据量小我发现程序没问题,量一大就不对劲了,form
反应变得很慢,而且form都拖不动了,程序变的很慢
TInitThread = class(TThread)
protected
procedure Execute; override;
public
constructor Create;
end;
var
NewThread: TInitThread; //声明线程对象
implementationconstructor TInitThread.Create;
begin
inherited Create(FALSE); //Createsuspended = false
FreeOnTermiNate := True;
end;procedure TInitThread.Execute; //重载execute
begin
Synchronize(DealData);
end;
procedure DealData();
begin
//处理signlist上数据,这里有查数据库,并需要较长时间
end;Procedure TForm1.SocketRecv(); //在这里接收socket的数据
begin
GLogCS.Enter; //这是线程同步:GLogCS: TCriticalSection;
signlist.Add(recvstr);//把收到的数据先添加到一个string数组上
GLogCS.Leave;
NewThread := TInitThread.Create; //创建新线程
end;我的问题是:
1、我的这种做发有问题吗?
2、在接收数据时,数据量很大,不停有数据进来,那我就不停的:
NewThread := TInitThread.Create;
这样总好象处理不过来,因为数据量小我发现程序没问题,量一大就不对劲了,form
反应变得很慢,而且form都拖不动了,程序变的很慢
解决方案 »
- Delphi程序实现一个效果给点建议
- method '' not supported by automation object
- 高分求一个过程
- 如何设置当打开一个窗口时另外一个窗口会自动关闭
- AdoQuery或者打taset有没有实现象select distinct功能的方法
- 大家看一下,ActiveForm上的SpeedButton没有重新绘制成flat样式
- 200分求Delphi 8 电子书籍
- dbexpress如何在代码里指定连哪个数据库?
- 你是个身材苗条的程序员吗?
- 我的DELPHI代码编辑窗录入时怎么没有提示?
- 请问在局域网中使用QQ视频时,QQ是怎么通过代理服务器发送到局域网中的机器上的呢?
- 掉用dll
这行代码的意思是: 我需要在主线程中运行DealData函数. 并且Synchronize的一个重要的工作是在一个全局变量中插入了dealdata的运行地址. 主线程在收到wm_null消息的时候来查看该全局变量是否有要执行的函数,有就执行. 同时线程在运行这行代码时就已经挂起来了.而好的做法是: 单独写一个同步界面的方法,只是将execute方法取得的或是计算出来的结果显示在主界面上.
如果你的 DealData 的确需要的主线程中执行, 那thread 就没作用了。
而且,你的SocketRecv不能保证刚好收到一个完整的数据包。数据量大时,可能收到很多数据,数据包
可能被分次接受。你直接接受处理是错误的,除非是UDP.事实上,你只需要创建一个线程,将所有接受的数据,送到该线程。
为了数据同步,在该线程增加接口,AddData(...), 增加数据时锁住你的缓冲区,execute 中处理数据时也要锁住缓冲区。