关于创建多个线程通讯中的问题。(100分)

  • 主题发起人 主题发起人 cjsam
  • 开始时间 开始时间
C

cjsam

Unregistered / Unconfirmed
GUEST, unregistred user!
我定义一个TCP通讯的线程类,但是这个类的excute()中只有发起第一个请求连接通讯。
然后就等待服务端发数据后,触发消息收数据,然后就发送其他的连接。
程序的大体结构是这样的。
TtcpSocket== class(TThread)
private
。。。。。。。
public
Constructor create(**);
destructor Destroy; override;
procedure ReadData(var Message: TMessage);//消息拦截服务器端发送来的消息。
procedure Execute; override;
end;
implementation
Constructor create(**);
begin
..........
inherited create(false);
end;.
.............
//启动线程只是发起第一次的通讯连接,然后其他的通讯就在后面收到服务端数据 后再发起。
procedure Execute;
begin
senddata()//发送请求连接。发起的通讯第一帧
end;
procedure ReadData(var Message: TMessage)
begin
Recv(sock,RecvBuff,Length(RecvBuff),0);
recvs:=copy(recvBuff,0,Length(recvbuff));
......//处理收到的数据,并发送处理后其他的数据来和服务端通讯。
case * of
end
end;
end;
程序的打胎结构就是这样的,我的主程序创建它,我需要和服务端模拟多少次通讯,就创建多少个该线程。
比如:我需要创建100个和服务端通讯就是:
var
tsck:TtcpSocket;
for i:=0 to 99 do
begin
tsck:=TtcpSocket.create(..) ;
end;
因为我的线程的创建是inherited(false),因此,肯定是开始运行和服务端通讯。

我的问题是::
创建单个线程没有问题,但是多个的时候,有时候能行,有时候通讯到一半的时候就停止了,好象收不到服务端的数据,报某个地址出错。大家帮我看一下有可能是那出问题了。
我这个创建的多个线程的问题我觉得是个很简单的问题,不许要同步,他们之间也不需要通讯,就相当创建多少个通讯,就创建多少个线程类的对象,而且我那线程只是在创建之初发了一帧请求连接的命令(在execute()中),然后就不管了,由这个对象中收到的消息来控
制,这为什么几个对象各自和服务端连接的时候会出现异常,还报内存错,会是什么方面的原因呢?谢谢大家,帮我看一下吧。
 
我怎么老看你那个消息处理函数那么别扭呢,你用socket通信应该是用自定义的消息吧,也就是名字上叫做消息,实际上socket通信传送的是两种方式嘛,一种是asc码,一种是字符流嘛,你用TMessage做参数,我不知道可以不,还有就是,没见你对接收缓冲区分配内存啊,我想问一下,你有看过接收的数据是什么吗?和传送的数据是一样的吗?
 
有分配缓冲区,我没写而已,接受的数据也基本上对,用TMessage做参数并不是来接受数据用,而只是知道服务器有数据来,接受是收在我的socket的缓冲区的,这个没什么问题,主要是在创建单个通讯连接对象进行通讯是没问题的,就是建立多个连接的时候就发生访问内存错,不知道是什么原因。我封状这个TtcpSocket,创建一个对象后,并没有用到这个类外面的参数,所有的操作都在这个类的内部定义的。应该不回出现冲突的。就是不知道是什么原因
 
基本上对是什么意思?有其他字符吗?如果有,我想应该要重这里下手了...还有就是我记得socket多连接的时候有个连接识别字,你有设置吗?就是识别哪个客户端是与那个服务线程连接的识别码
 
后退
顶部