怎样使用多线程进行数据的收发?使用TThread对象可以吗?如何实现呢?大家请进。

BoweirrKing 2003-11-30 08:18:47
怎样使用多线程进行数据的收发?我发现发送的数据量一大,程序就没有响应了。所以我想用多线程。请大家帮忙解决一下。

使用TThread对象可以吗?如何实现呢?谢谢你们了。
...全文
49 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
BoweirrKing 2003-12-10
  • 打赏
  • 举报
回复
if(对方接收完毕)break;

那我怎么知道对方接收完毕了呢? 我的思路是另外用一个Client来发送这边已经接收完毕的消息,你看可以吗?

但是在实际编码的时候,那些CS逻辑已经有些混乱了,呵呵....
lbg 2003-12-09
  • 打赏
  • 举报
回复
snedsock->Active=true;
sendsock->Socket->SendBuf(buf,10000);来发送数据,但是,在服务器那边就收不到,表现为无法激活OnClientRead事件(Host以及Port均设置正确),这是怎么回事?

要循环来等的...,如果在Execute()中只有:
snedsock->Active=true;
sendsock->Socket->SendBuf(buf,10000);
这样会导致在数据还没有发送之前就线程结束了,对方肯定不能接收到数据 ,需要加:
while(1)
{
if(对方接收完毕)break;
}
BoweirrKing 2003-12-09
  • 打赏
  • 举报
回复
哦,是这样的啊。我要好好钻研一下啦。谢谢你们啦。
BoweirrKing 2003-12-01
  • 打赏
  • 举报
回复
我自己想了个方法,似乎不行,请大家看看。

我在派生出的TMyThread中添加了一个成员变量 TClientSocket *sendsock;
我在TThread的构造函数中添加了一个参数,是一个 TClientSocket *sock,我想用它来发送数据。在构造函数中,使得 sendsock=sock; 然后在Execute()中使用
snedsock->Active=true;
sendsock->Socket->SendBuf(buf,10000);来发送数据,但是,在服务器那边就收不到,表现为无法激活OnClientRead事件(Host以及Port均设置正确),这是怎么回事?

你们都是怎么实现的?有电子版的教材可以给我看看吗?我想下载看看。

另外,在收数据的时候,也有停止响应的情况出现,不知你们遇到过吗?
其实如果有好书的话,我也不会这么郁闷了。还希望你们多多指教啊。
TangSe 2003-12-01
  • 打赏
  • 举报
回复
同意pp616(游戏全删了) ,用socket api 把bc的ClientSocket 和 ServerSocket丢掉吧。实在太不爽了。

做多线程,服务器,同步处理等非常不爽。肯定要自己写的。
pp616 2003-12-01
  • 打赏
  • 举报
回复
用socket api 把bc的ClientSocket 和 ServerSocket丢掉吧。实在太不爽了。
jhwh 2003-12-01
  • 打赏
  • 举报
回复
你使用线程是阻塞方式,而OnClientRead 是异步方式,当然不能激活。服务器也必须使用阻塞方式连接。
TangSe 2003-12-01
  • 打赏
  • 举报
回复
to BoweirrKing(忽然变傻) :

我觉得好书便是vcl源代码,在bcb\source\vcl下面,写的很清晰,很容易理解。
TangSe 2003-12-01
  • 打赏
  • 举报
回复
怎么发送的数据量大了就没有响应了呢?
跟大小没关系的呀。
发送对于你的程序来说,是不需要时间的,系统直接把你的发送数据拷贝到系统tcp/ip堆栈中,如果非组赛的话,立即返回。当然如果缓冲区满等问题,会返回wsa would block错误,继续发就是了。

sendoskc->active=true;
可能并没有连接上。TClientSocket他的这个连接过程可能是非组赛的,你看看sockcomp.pas。你要在OnConnect事件中判断是否连接上了。我不用这个的,自己用winsock api写的vcl组件,connect是组赛的,直接知道连接上没有,而接受/发送是非组赛的。

/*
我在派生出的TMyThread中添加了一个成员变量 TClientSocket *sendsock;
我在TThread的构造函数中添加了一个参数,是一个 TClientSocket *sock,我想用它来发送数据。在构造函数中,使得 sendsock=sock; 然后在Execute()中使用
snedsock->Active=true;
sendsock->Socket->SendBuf(buf,10000);来发送数据,但是,在服务器那边就收不到,表现为无法激活OnClientRead事件(Host以及Port均设置正确),这是怎么回事?


shadowstar 2003-12-01
  • 打赏
  • 举报
回复
可以!
实现可以参考一下BCB的例子,还是看看书吧。。。
pp616 2003-12-01
  • 打赏
  • 举报
回复
你准备做什么。用什么做。
HenryGo 2003-11-30
  • 打赏
  • 举报
回复
不是很懂
热情up
叶子哟 2003-11-30
  • 打赏
  • 举报
回复
www.ccrun.com
www.chinabcb.com上下个example看看
主要是解决同步的问题

1,317

社区成员

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

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