Socket接收数据并进行缓存:List:Strings;
procedure TXMlData.OnReadData(Sender: TObject; Socket: TCustomWinSocket); //OnRead事件对应的过程
begin
BeforeResolveData:=TStringList.Create;
BeforeResolveData.Text:=Socket.ReceiveText;//每秒收到800条左右的数据
List.AddObject(IntToStr(Index),BeforeResolveData);
while List.Count>0 do
begin
ProcessData;//些过程用处理 AlarmList中缓存的数据,此过程比较耗时间
end;
end;ProcessData放在Socket接收中会不影响Socket接收数据?接收大量为防止处理不过来,有没有什么好的方法,请高手指点。我觉得象上面这么做会有问题,比如现在正执行while这时又来了一个新的数据Soket能不能接收?它还会存到List中去吗?
procedure TXMlData.OnReadData(Sender: TObject; Socket: TCustomWinSocket); //OnRead事件对应的过程
begin
BeforeResolveData:=TStringList.Create;
BeforeResolveData.Text:=Socket.ReceiveText;//每秒收到800条左右的数据
List.AddObject(IntToStr(Index),BeforeResolveData);
while List.Count>0 do
begin
ProcessData;//些过程用处理 AlarmList中缓存的数据,此过程比较耗时间
end;
end;ProcessData放在Socket接收中会不影响Socket接收数据?接收大量为防止处理不过来,有没有什么好的方法,请高手指点。我觉得象上面这么做会有问题,比如现在正执行while这时又来了一个新的数据Soket能不能接收?它还会存到List中去吗?
解决方案 »
- crc校验码的计算方法
- 关于LISTVIEW操作数据库问题!!!急急急,在线等!!!
- 在触摸屏查询系统中怎样设计模拟键盘输入数字,最好也能输入中文 ?
- ★★★★★以印尼海啸般的气势,强烈BS-D版首席LS“夜星JR”!!!!!!!!!!!!!!!!!!!!
- 怎样用DELPHI+SQL把查询到记录导成EXECL
- 准备上传一个优秀的国产报表组件,请哪位提供一个地方上传!
- 需要一个能显示DLL中提供的函数的工具
- 在TChart控件的Series中,我想要删除其中的某一个点,请问如何做?to findcsdn
- 100分++向高手请教,tcp/ip & socket问题。
- delphi7如何判断是扫描枪输入还是键盘输入
- 怎样才能使报表的Title(表的标题)在每一页打印都出现?
- 请问济南,和北京程序员都如何?
现在是只能被动的接收数据,怎么样做才保证不丢失数据呢?有没有好的建议?
不是这个问题,即使发1024他字节,也不能解问题,因为发送的频率比较大,而不是数据量大的问题。还有如果按你这么做,实际是做数据缓存放在服务器端,在我这里是不可能的,因为要接收数据的服务器,只是一个数据转发服务器,不对数据进行任何处理。
你是说当While执行的时候,Socket就不接收数据了,也不往List里存了?那需要用什么方法才可以呢?
不过在不考虑协议和不能改变服务端传送方式的情况下,可以这样来作:
在客户端将数据接收和处理分开,也就是:
BeforeResolveData.Text:=Socket.ReceiveText;//接收数据
和
ProcessData;
不要都放在TXMlData.OnReadData中。TXMlData.OnReadData应该只管接收,然后用另外一个线程专门来ProcessData(处理数据)。————————————————————————————————————
宠辱不惊,看庭前花开花落,去留无意;毁誉由人,望天上云卷云舒,聚散任风。
————————————————————————————————————
线程方式有个疑问,因为程序实时性要求很高,就是说,从转发服务器接收来的数据必须及时的处理。如果用线程来做怎么会知道什么时间来数据?是不是可以让线程始终在执行,比如:
while 1 > 0 do
begin
Synchronize(ProcessData);
end;
这个样子是可以,但是CPU占用太大, 如果Sleep();一下,就不能做到实时了