由于一开始的不了解,我的程序已经不能完全按照最优化的方法来写了,对我来说时间不够了。
我的聊天程序大概是这样的:
1)在服务器设置了一个队列List用来保存已经连接的线程信息吗,其中包括Thread2)在客户端的聊天界面设置了一个进程,监听发过来的信息,保存到TStringList里面。同时,设置了一个Timer,每过一段时间读取TStringList,并作出处理。3)在好友列表里面,又用了一个Timer,不断的Write指令给服务器,让他传回当前所有在线用户的信息。4)我用LockList阻塞所有的线程,然后,对每一个线程都发送数据,再在客户端进行分析处理,是自己的信息就拿走,不是自己的信息就放过。大概就是这些。我现在又三个问题
1)聊天的时候,聊着聊着会卡住。例如A对B说:你好 ,B会卡死, A再对B说一次你好,则B会收到两次你好的信息,并且先发送的你好在后面显示出来了。2)聊天界面的当前时间提示(一个Label和Timer控制的)会卡住3)有时候会出现Out of **** memory 大概是这个的错误信息。我曾经想到的解决办法1)是好友列表里面的Timer不断Write的缘故。所以曾经多设置过一个TcpClient用于区分,失败2)网友说是我的Write和Read都应该建立线程,分别处理,我的Write语句是和主进程一起进行的,所以会出现上面提到的“卡死”。不知道是不是这样3)卡死的源头到底在哪里呢?为什么呢?网络上的例子我认真分析过了,但是很少有可以运行成功的例子供我分析,Indy Demo里面的例子,我运行了都卡死了..
有时间的朋友,帮帮忙,我很着急。谢谢啦我的分数有限,但是还可以加一些。大家帮帮我。

解决方案 »

  1.   

    你用看看indy里面不是有一个聊天室的demo么
      

  2.   

    不太了解,顶一个.Indy的TCP控件,本来就有线程.发送一条,建立一个.没必要自己新开.
      

  3.   

    熊猫超人,你说的是那个chat的目录吗
      

  4.   

    局域网内聊天采用udp协议就可以了>>熊猫超人,你说的是那个chat的目录吗?
    是的
      

  5.   


    我看了那个啊   他运行时客户端卡死了....          我差不多是按照那个做的
    对了  那个你说的链路层里面的Thread的类型是定义成Pointer还是TIdPeerThread啊
      

  6.   

    通信链路保存,你可以使用TThreadList来保存
      

  7.   

    由于一开始的不了解,我的程序已经不能完全按照最优化的方法来写了,对我来说时间不够了。 
    我的聊天程序大概是这样的: 
    1)在服务器设置了一个队列List用来保存已经连接的线程信息吗,其中包括Thread 2)在客户端的聊天界面设置了一个进程,监听发过来的信息,保存到TStringList里面。同时,设置了一个Timer,每过一段时间读取TStringList,并作出处理。 
    //监听这个地方用一个线程,读取TStringList并处理的过程肯定 会阻塞,不卡才怪,处理完成了就不卡了3)在好友列表里面,又用了一个Timer,不断的Write指令给服务器,让他传回当前所有在线用户的信息。 
    //为啥不断的Write?为什么不在用户状态发生变化时,由服务器主动向所有客户端广播用户列表?当然你也需要一个监听线程,如果压力不大,完全可以和前面用同一个线程4)我用LockList阻塞所有的线程,然后,对每一个线程都发送数据,再在客户端进行分析处理,是自己的信息就拿走,不是自己的信息就放过。 
    //服务器端来LockList吧,是服务器判断后,发给相应客户端的线程,难道你要广播给所有用户,客户端自己分析数据包来决定是否显示在聊天窗口?麻烦吧
    大概就是这些。我现在又三个问题 
    1)聊天的时候,聊着聊着会卡住。例如A对B说:你好 ,B会卡死, A再对B说一次你好,则B会收到两次你好的信息,并且先发送的你好在后面显示出来了。 2)聊天界面的当前时间提示(一个Label和Timer控制的)会卡住 3)有时候会出现Out of **** memory 大概是这个的错误信息。 我曾经想到的解决办法 1)是好友列表里面的Timer不断Write的缘故。所以曾经多设置过一个TcpClient用于区分,失败 //都在主线程里,当然仍然会卡死,主动发送好了,不用客户端不断Write,难道你想发心跳包给服务器?2)网友说是我的Write和Read都应该建立线程,分别处理,我的Write语句是和主进程一起进行的,所以会出现上面提到的“卡死”。不知道是不是这样 //Write可以单独创建线程,也可放在主线程里3)卡死的源头到底在哪里呢?为什么呢?网络上的例子我认真分析过了,但是很少有可以运行成功的例子供我分析,Indy Demo里面的例子,我运行了都卡死了.. 
    //哪个卡死?
    有时间的朋友,帮帮忙,我很着急。谢谢啦 我的分数有限,但是还可以加一些。大家帮帮我。
      

  8.   

    把监听别人发来的消息放在一个自定义线程里,发送消息可以放在主线程里,就像indy demo里的chat一样,不要写一个死循环来不停的读取
      

  9.   

    indy本身就是阻塞模式的,想建聊天室用udp吧
      

  10.   

    udp是不可靠的,如果仅仅想做一个聊天室的话不如用asp.net
      

  11.   

    楼主,INDY每个连接是个线程,得注意同步问题,你可尝试换换其它控件试试,如异步的ICS。