一个关于IdTCPClient通信的疑问??

songykai 2005-07-06 11:16:01
IdTCPClient是基于线程的控件,当它和服务器建立一个连接后,就开启了一个线程,接收数据的过程应可以在此线程中进行,可我在这儿看到的一些程序是这样的:
void __fastcall TFormclient::TimerTimer(TObject *Sender) //timer 事件
{
String Msg;
if(!Client->Connected())
return;
try
{
Msg = Client->ReadLn("",5);
}
catch (...)
{

.....
}

......
...全文
146 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
songykai 2005-07-06
  • 打赏
  • 举报
回复
学习CBuilder很痛苦,例子太少,有使用线程的例子吗?
  • 打赏
  • 举报
回复
使用TTimer是为了简化处理,使用线程也可以。
因为Indy的整个结构是基于Blocking Socket的,所以在线程中处理必须考虑互斥,即和其他线程同时读写的问题。
而TTimer是基于WM_TIMER消息的,是同步事件,在主线程中执行,只要不开多线程序,就不用考虑互斥问题。
但是使用TTimer也有问题:
1. 响应未必及时;
2. 可能导致GUI更新变慢。
所以通常都是在一些例子程序里才这样使用。
songykai 2005-07-06
  • 打赏
  • 举报
回复
就是说习惯用一个Timer控件定时读数据,如有则响应,直接在线程中响应不行吗?

FengSC 2005-07-06
  • 打赏
  • 举报
回复
你的问题是什么?
songykai 2005-07-06
  • 打赏
  • 举报
回复
请帮忙分析这段代码
void __fastcall TMainForm::IdTCPServer1Execute(TIdPeerThread *AThread)
{
String Msg;
int intSize;
TMemoryStream * Stream=new TMemoryStream();
try
{
try
{
Msg=AThread->Connection->ReadLn("",100);
}
catch(...)
{
}

if(Msg..Length())!=0)
{
dm->users->Params->ParamByName("para1")->AsString=ename;
dm->users->Open(); //出错,为什么不能在此打开表?
}
.................
constantine 2005-07-06
  • 打赏
  • 举报
回复
你为什么不自己写一个线程,把接受放到线程里面呢?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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