IDTcpServer丢数据?请高手指教&……

啥都得学呀 2009-08-28 02:15:45
我刚刚做了个测试

用INDY里的TCPSERVER和 TCPCLIENT


执行的功能是,CLINET循环500次连接,每次连接随便发送一个简单的字符串。SERVER端,只负责记录下来这些数据,记录成功,返回1,记录失败,返回2。

当我开一个CLIENT的时候,每次都完全都能记录下来500条数据。而且完全都成功的。即使循环100次,也没问题。


但是,当我用2个CLIENT,差不多一起点循环按钮的时候,问题就出现了。如果2个客户端分别循环500次的话,差不多丢了100以上的数据,更可恨的事,返回的结果居然都是成功。当然,极少的情况下也会出现失败。但少的可怜……

我想知道,怎么会丢数据了呢??


附带我接受的时候的代码 IdTCPServerExecute(AContext: TIdContext);ReceText := copy(s, 5, length(s));
TIdSync.SynchronizeMethod(ExecuteCommand);
if OpResult then AContext.Connection.Socket.Write('1' + #13#10) OpResult 是操作结果
else AContext.Connection.Socket.Write('2' + #13#10);

{这里是同步方法}
procedure TFormIndex.ExecuteCommand;
var MainData: string;
begin
{执行命令}
OpResult := ValiKey(ReceText);{这里判断的是字符串是否合法}
if not OpResult then exit;

MainData := copy(ReceText, pos('|', ReceText) + 1, length(ReceText));

OpResult := REWRITETXT(ExtractFilePath(Paramstr(0)) + 'SysLog.txt', MainData);{这里执行把数据写入TXT文本}
end;


{这里是写入TXT文本}
function REWRITETXT(FILEPATH: string; VALUES: string): BOOLEAN;
var
FileHandle: integer;
txtFile: TextFile;
begin
try
if not FileExists(FILEPATH) then
begin
FileHandle := FileCreate(FILEPATH);
FileClose(FileHandle);
end;
AssignFile(txtFile, FILEPATH);
Append(txtFile);
Writeln(txtFile, VALUES);
CloseFile(txtFile);
RESULT := TRUE;
except
RESULT := FALSE;
end;
end;

...全文
255 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
sanguomi 2009-08-29
  • 打赏
  • 举报
回复
一般来说,VCL可视控件都不是线程安全的,非可视的基本都是.
利用消息队列进行VCL可视控件的同步,所以一般VCL可视组件要用
synchronize同步
TCriticalSection 只是对全局的数据比如变量进行保护,不能保护VCL类

俩者应用是不同的,
啥都得学呀 2009-08-29
  • 打赏
  • 举报
回复
那么,问题如何根本上解决?没有人正面回答和解答我的难题么?
sanguomi 2009-08-29
  • 打赏
  • 举报
回复
Synchronize()只是将该线程的代码放到主线程中运行,并非线程同步。
啥都得学呀 2009-08-29
  • 打赏
  • 举报
回复
如果不同步,写文本就会出错。因为多个线程,在并发的时候操作一个文件,那就肯定也出错了
啥都得学呀 2009-08-29
  • 打赏
  • 举报
回复
我刚刚测试过了。如果全部转成局部变量,情况确实好一些。那么,我现在开始怀疑,那同步过程到底有什么意义了!!


另外,测试结果表明,当多个客户端同时循环的连接发送中,服务器端,在写文本的时候,会出错。也就是,大家一起写一个文本,当某个并发点诞生的时候,写入是失败的。
那么,如何回避这个问题呢?
啥都得学呀 2009-08-29
  • 打赏
  • 举报
回复

[Quote=引用 4 楼 jadeluo 的回复:]
对于多个Client在Server端的线程来说, 你的ReceText和OpResult都是个全局变量, 会出现多个线程同时读取这些变量的可能, 导致程序逻辑异常。
[/Quote]

同步过程中,也会出现这个问题?还望赐教一二!难道,这里不采用全局变量而用局部变量,而抛弃同步TIdSync.SynchronizeMethod
jadeluo 2009-08-29
  • 打赏
  • 举报
回复
对于多个Client在Server端的线程来说, 你的ReceText和OpResult都是个全局变量, 会出现多个线程同时读取这些变量的可能, 导致程序逻辑异常。
啥都得学呀 2009-08-29
  • 打赏
  • 举报
回复
居然没人回复?!难道都遇到这个问题没解决?
啥都得学呀 2009-08-29
  • 打赏
  • 举报
回复
问题解决了如下!

先声明一个TRTLCriticalSection类型的全局变量

var
MyCs:TRTLCriticalSection;

在程序开始或建立线程之前,初始化

InitializeCriticalSection(MyCs);//初始化临界区

在程序结束或所有线程结束后,删除它

DeleteCriticalSection(MyCs);//删除临界界

再在线程中要同步的地方加入

EnterCriticalSection(MyCs); //进入临界区
try
//程序代码
finally
LeaveCriticalSection(MyCs); //离开临界区
end;



另外在提一个问题,我唯一没弄明白的问题。

TIdSync.SynchronizeMethod 或者 Synchronize 到底什么时候用我看INDY的DEMO里,就没用。但是有人开发的DEMO里就强调了这一点。我现在很茫然。

我个人猜想:如果使用主线程中的控件,如TEXTBOX等可视的控件,就用Synchronize 。反之。就可以不用!

个人感觉还是很茫然。烦劳高手们指教!
shuihan20e 2009-08-29
  • 打赏
  • 举报
回复
TCriticalSection
SuperTitan001 2009-08-29
  • 打赏
  • 举报
回复
搜索delphi 临界区就可以了
临界区和线程有关,与indy, IDTCPSERVER没有关系
啥都得学呀 2009-08-29
  • 打赏
  • 举报
回复
搜索了一下,DELPHI INDY IDTCPSERVER 的临界区的帖子和技术文档 都没有!
啥都得学呀 2009-08-29
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 shuihan20e 的回复:]
可以借助临界区
[/Quote]

边界区?没用过。有例子么?
shuihan20e 2009-08-29
  • 打赏
  • 举报
回复
可以借助临界区
啥都得学呀 2009-08-28
  • 打赏
  • 举报
回复
无疑中发现的。我就想测试下并发……

开了4个客户端,每个客户端都是1-500次连接,每次连接发一条数据就关。

结果,发现记录下来的数据少了2、300条数据。都不知道丢啥地方去了。更可气的是,返回的结果都是成功的。

如果单独开一个客户端,1对1的发包(发多少次都不会出问题,都毫无遗漏的记录下来),就不会出问题。我找了半天问题。也不知道咋回事%……
shuihan20e 2009-08-28
  • 打赏
  • 举报
回复
先SF,再仔细看
源码直接下载地址: https://pan.quark.cn/s/a4b39357ea24 在信息技术领域中,开发一个模仿微信客服交流平台的界面是一项普遍的需求,尤其是在构建企业级沟通工具时。这个名为"仿微信客服交流界面(具备聊天信息本地数据库存储功能)"的项目,致力于为用户创造一个类似于微信的互动体验,并且已经完成了聊天信息在本地数据库中的保存功能,以此保障信息的安全性和可恢复性。另外,项目还包含了网络传输的代码,旨在帮助开发者更好地理解和将此功能整合进自己的应用程序中。 现在让我们深入探究聊天界面的构建过程。微信客服交流界面通常由以下几个核心组件构成:用户个人照片、昵称展示、消息展示气泡、时间标记、输入区域以及发送控制键。这些组件需要经过细致的排布,以确保界面既清晰又便于使用。在用户界面设计方面,一般会采用 Material Design 或者 iOS 的 Human Interface Guidelines 来设计符合平台标准的界面。源代码文件 ChatUIDemo 可能包含了这一界面实现的代码,开发者可以通过查看和调整这个文件来个性化自己的聊天界面。 聊天信息在本地数据库中的存储是一项核心功能。在该项目中,或许选用了SQLite作为轻量级数据库,因为它易于集成,支持事务处理,适合存储结构化的数据,例如用户标识符、接收者标识符、消息内容、发送时刻等。通过运用SQL指令,能够执行数据的增加、删除、修改和查询操作,从而确保聊天记录的完整性和一致性。开发者可能需要关注如何将新接收到的消息添加到数据库中,以及如何从数据库中获取历史记录并在界面上进行展示。 在网络传输方面,可能通过HTTP或HTTPS协议来实现,并且使用了诸如AFNetworking(iOS)或O...
内容概要:本文围绕虚拟同步发电机(VSG)接入弱电网的序阻抗建模与稳定性分析开展研究,基于Matlab/Simulink平台搭建详细的仿真模型,系统复现并验证相关理论方法。研究重点包括VSG在弱电网条件下的正负序阻抗特性建模、基于小信号分析的扫频法建模流程、系统阻抗交互特性及潜在的失稳机理分析。通过具体仿真案例,深入探讨了VSG控制参数对系统稳定性的影响,旨在为新能源并网系统的稳定运行提供理论依据与技术支撑。该内容属于电力电子与电力系统稳定性交叉领域的前沿课题,具有重要的学术价值与工程应用前景。; 适合人群:具备电力系统分析、电力电子变换器控制等基础知识,熟悉Matlab/Simulink仿真环境,从事新能源并网、微电网控制、电力系统稳定性研究的研究生、科研人员及工程师;有志于复现高水平期刊论文中阻抗建模与稳定性分析方法的技术开发者。; 使用场景及目标:① 掌握虚拟同步发电机在弱电网中的序阻抗建模理论与实现方法;② 理解并实践基于扫频法的小信号稳定性分析全过程;③ 应用于构网型变流器、虚拟同步机等先进并网技术的稳定性研究与仿真验证。; 阅读建议:建议结合所提供的Simulink仿真模型与技术资料,按照文档结构循序渐进地学习,重点关注建模原理、仿真参数设置与结果分析过程,同时参考链接中的完整资源进行代码调试与深入探究。
内容概要:本文围绕电动汽车参与电力系统运行备用的能力评估开展研究,利用Matlab代码实现对电动汽车群体作为灵活性资源参与电网辅助服务的建模与仿真分析。研究重点包括基于多面体聚合与闵可夫斯基和的电动汽车可调能力(功率容量)量化方法、其在多时间尺度调度中的响应特性建模、运行备用潜力的聚合评估,以及结合智能优化算法的仿真验证,旨在系统性分析电动汽车在提供运行备用方面的技术可行性、调控潜力与系统价值。; 适合人群:具备电力系统运行与控制、智能优化算法基础,以及Matlab/Simulink编程能力的高校研究生、科研机构研究人员及从事新能源并网、需求响应、智能电网相关工作的工程技术人员。; 使用场景及目标:①掌握电动汽车集群可调能力的数学建模与聚合评估方法;②研究电动汽车参与电力系统多时间尺度协调调度的实现机制;③为高比例可再生能源电力系统的灵活性提升与运行备用资源配置提供技术参考与仿真工具支持。; 阅读建议:建议读者结合文中提供的Matlab代码深入理解电动汽车聚合建模与备用能力评估的具体实现流程,重点关注多面体建模、闵可夫斯基和运算及优化求解部分,并可延伸学习同平台关于V2G、微电网调度等相关资源以构建完整的知识体系。

1,594

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧