IdTCPClient怎么在线程里接收返回值而不卡死

宝龙哥 2011-07-13 10:07:48
IdTCPClient是阻塞式的,也没有Execute这样的事件

现在要实现这样的效果,IdTCPClient连接IdTCPServer后一边工作响应用户的工作,一边随时能接收到IdTCPServer发来的数据并返回给用户

按照网上的说法做了一个线程,IdTCPServer端用:
AContext->Connection->IOHandler->WriteLn(L"已经收到",TEncoding::Unicode);
发回一个字符串,IdTCPClient端在线程的循环里面用:
String s=Form1->IdTCPClient1->IOHandler->ReadLn(TEncoding::Unicode);
Form1->Memo1->Lines->Add(s);
随时接收,但程序还是停止响应了,这个要怎么处理才能在IdTCPServer没有数据发回来时不停止响应?
...全文
217 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
缘中人 2011-07-13
  • 打赏
  • 举报
回复
来接分的,不过把你的解决思路分享下大家会感谢你的。
宝龙哥 2011-07-13
  • 打赏
  • 举报
回复
已经自己搞定了,谁上来像模像样的说两句话我挑几个说的好的结贴给分
宝龙哥 2011-07-13
  • 打赏
  • 举报
回复
用的C++Builder XE
宝龙哥 2011-07-13
  • 打赏
  • 举报
回复
当传文件时,第一次传的文件速度很快,以后重传几次速度都慢了,追踪了以下发现内存和CPU的使用都没有明显的变化
宝龙哥 2011-07-13
  • 打赏
  • 举报
回复
随着这两天的使用,对INDY的IdTCP控件的理解越来越清晰了,目前发现idtcp的这两个控件还是不错的,问题只是这两个控件还没有完全的实现高度的自动化

比如心跳包部分,IdTCPClient的接收部分等都要自己处理,好在都有解决方法,且不是BUG
宝龙哥 2011-07-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ksrsoft 的回复:]
来接分的,不过把你的解决思路分享下大家会感谢你的。
[/Quote]

那就感谢我吧,在线程里面:
String s=Form1->IdTCPClient1->IOHandler->ReadLn("",5,0,TEncoding::Unicode);
if(s!=""){
Form1->Memo1->Lines->Add(Now().FormatString("yyyy-mm-dd hh:nn:ss"));
Form1->Memo1->Lines->Add(Form1->IdTCPClient1->Host);//localhost
Form1->Memo1->Lines->Add(Form1->IdTCPClient1->Port);
Form1->Memo1->Lines->Add(L"服务器说:");
Form1->Memo1->Lines->Add(s);
}
就可以了,耗费资源很少,也没出现什么问题

tsk说的有点价值,分就给他了
tsk 2011-07-13
  • 打赏
  • 举报
回复
哈哈,最近发现 Indy 10.5.5 真不好用,用SSL 的IdHTTP就会出现 Socket Error #0 错误。

经过一翻折腾,升级到 Indy 10.5.8 于是就解决了。

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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