初学MFC。。被卡住了。。这个什么问题啊啊啊啊啊。。不烦劳各位太多时间 直接奉上工程http://download.csdn.net/source/3111746问题如下:一个局域网聊天软件     用户点击“建立连接”建立用户进程 响应函数为clientFouction 
    
    服务器点击“启动监听”建立服务器进程  响应函数为serverFouction    
    线程不断判断edit文本框 是否可以发送 是则发送 否则继续循环我的情况是:如果我把MyChartDlg.cpp 第367行 和第429行的 文本框内容是否可发送判断 去掉则server client发送正常
加上就不行了     哪位给看看啊 是这个判断有问题还是线程什么的啊!!!!!!!!!!!!!!!!!!!!!!!!!    500分以示敬意 分5贴给分

解决方案 »

  1.   

    工程没有看,你是在线程里直接判断edit文本框的是否有数据发送的?
      

  2.   


    用一个全局的bool sentable 标记 点击发送的时候 如果edit不为空就把sentable设为true 否则false线程不断判断这个bool sentable 若为true则发送 发送完后把sentable 设为false
      

  3.   

    奥,这样啊。
    碰巧之前我也写过一个和你类似的,我的资源里有。我只用了udp,因为是局域网通信,我也采用了服务器。
    不过我的服务器只是完成很小一部分功能,主要通信还是采用udp点对点。
      

  4.   

    我明白你的意思了。
    你这种方法本身就有问题。如果多个客户端同时连接你的服务器,你程序必然无法处理。
    你的程序全部采用tcp连接,思想有问题。
    按照你的意思,应该这样:
    服务器监听,每接受一个连接,就要创建一个新的线程去和客户端通信。你里面没有这么做吧。
      

  5.   

    既然MFC提供了DDX为什么不把edit和show一样绑了用面对对象的方法去处理呢
    我看了下代码感觉应该是个小问题,但是VC6编译不了,杯具
    你自己用TRACE宏调试一下看看那个if里面的BOOL值到底变没变过不就知道么了?
      

  6.   

    1.多个地方判断sentable你肯定要家互斥零界区之类的进行同步
    2.用了同一个sentable判断,那有两个连接上来必然会出逻辑错误
      

  7.   

    临界区同步应该也没有用
    LZ代码里面本身就在判断了sentable为TRUE之后将其值成false;即使加入关键段也没有用。还是执行了第一个线程之后第二个线程就执行不了了。而判断和赋值给BOOL本身在32系统上汇编代码就是原子操作,同步意义不大。
    给LZ个建议:LZ既然用了sentable开关来决定是否执行,那就用两个全局变量好了。在点了SEND按钮以后将两个变量全部置成TRUE。然后在IF判断之后分别将他们再置为FALSE就可以了。否则基本总会有一个线程进不了IF,除非两个线程的IF判断完全同时发生,这几乎不可能。
    总的来说这样在两个线程里面分别SEND RECV写代码的结构很不好,但是RECV是阻塞的,所以问题应该不大。
      

  8.   

    还有LZ
    我没有看到你用IOCTLSOCKET设置非阻塞,说明你RECV是阻塞的。不接收到数据不会继续执行。
    那么你没按发送按钮两个线程第一次执行到RECV就阻塞住了。线程就全部挂起了。形成了经典的死锁问题。
    自然不管你怎么按也没有用了。
    如果要修改程序这个地方也要改。把RECV和相关的处理过程放IF里面去。
      

  9.   

    点击“建立连接”选择建立服务器端 建立client进程 同时“启动监听”按钮就disable了 server进程是不建立的 所以 这个程序运行时只有UI进程和server/client任选一个加起来两个进程 不存在server/client造成死锁 
      

  10.   


    我的意思是:你不是点那个确定才触发的OnBnClickedsentbutton么?
    但是你线程应该是点了监听之后就起来了吧。而你线程用的阻塞方式的RECV,那么就这种方式一定要收到一个SEND发来的内容代码才能继续向下执行。但是你的RECV是写在循环里面的无条件执行,所以不管你起多少线程C和S的收发线程都在起来立刻阻塞在RECV不再向下执行了,你再怎么点确定也自然不会有用。
    简单来讲就是你程序里面的线程都卡在RECV这一行了了,但是要解除RECV只有去调前面代码中的SEND,程序已经卡在RECV怎么可能再向前回朔,造成了两个进程之间的死锁。