初学MFC。。被卡住了。。这个什么问题啊啊啊啊啊。。不烦劳各位太多时间 直接奉上工程http://download.csdn.net/source/3111746问题如下:一个局域网聊天软件 用户点击“建立连接”建立用户进程 响应函数为clientFouction
服务器点击“启动监听”建立服务器进程 响应函数为serverFouction
线程不断判断edit文本框 是否可以发送 是则发送 否则继续循环我的情况是:如果我把MyChartDlg.cpp 第367行 和第429行的 文本框内容是否可发送判断 去掉则server client发送正常
加上就不行了 哪位给看看啊 是这个判断有问题还是线程什么的啊!!!!!!!!!!!!!!!!!!!!!!!!! 500分以示敬意 分5贴给分
解决方案 »
- 请问谁有王亚民ActiveX旋钮控件源码
- 急?怎样鼠标左键在某个Button上的按下和抬起状态,并分别添加相应的处理代码?
- 为什么我写的程序debug版本比release版本快很多倍呢? 可能有5倍的差别. 郁闷!
- 在Dll中添加了一个函数,在别的程序中调用时Link出错???
- wdm过虑驱动
- ODBC连接SQL Server的问题 很简单,在线等,马上结
- 如何將一個CString類型的變量內容傳遞到一個帶指針類型參數的函數中?
- 对话框的ID问题!请高手指点!!多谢!!!
- 谁有ping的源码???
- 毕业设计求助!基于OPENCV的车辆检测毕设程序修改
- 好几个月在VC版是潜水,现在冒个泡.
- VC++ DLL数据共享的疑问
用一个全局的bool sentable 标记 点击发送的时候 如果edit不为空就把sentable设为true 否则false线程不断判断这个bool sentable 若为true则发送 发送完后把sentable 设为false
碰巧之前我也写过一个和你类似的,我的资源里有。我只用了udp,因为是局域网通信,我也采用了服务器。
不过我的服务器只是完成很小一部分功能,主要通信还是采用udp点对点。
你这种方法本身就有问题。如果多个客户端同时连接你的服务器,你程序必然无法处理。
你的程序全部采用tcp连接,思想有问题。
按照你的意思,应该这样:
服务器监听,每接受一个连接,就要创建一个新的线程去和客户端通信。你里面没有这么做吧。
我看了下代码感觉应该是个小问题,但是VC6编译不了,杯具
你自己用TRACE宏调试一下看看那个if里面的BOOL值到底变没变过不就知道么了?
2.用了同一个sentable判断,那有两个连接上来必然会出逻辑错误
LZ代码里面本身就在判断了sentable为TRUE之后将其值成false;即使加入关键段也没有用。还是执行了第一个线程之后第二个线程就执行不了了。而判断和赋值给BOOL本身在32系统上汇编代码就是原子操作,同步意义不大。
给LZ个建议:LZ既然用了sentable开关来决定是否执行,那就用两个全局变量好了。在点了SEND按钮以后将两个变量全部置成TRUE。然后在IF判断之后分别将他们再置为FALSE就可以了。否则基本总会有一个线程进不了IF,除非两个线程的IF判断完全同时发生,这几乎不可能。
总的来说这样在两个线程里面分别SEND RECV写代码的结构很不好,但是RECV是阻塞的,所以问题应该不大。
我没有看到你用IOCTLSOCKET设置非阻塞,说明你RECV是阻塞的。不接收到数据不会继续执行。
那么你没按发送按钮两个线程第一次执行到RECV就阻塞住了。线程就全部挂起了。形成了经典的死锁问题。
自然不管你怎么按也没有用了。
如果要修改程序这个地方也要改。把RECV和相关的处理过程放IF里面去。
我的意思是:你不是点那个确定才触发的OnBnClickedsentbutton么?
但是你线程应该是点了监听之后就起来了吧。而你线程用的阻塞方式的RECV,那么就这种方式一定要收到一个SEND发来的内容代码才能继续向下执行。但是你的RECV是写在循环里面的无条件执行,所以不管你起多少线程C和S的收发线程都在起来立刻阻塞在RECV不再向下执行了,你再怎么点确定也自然不会有用。
简单来讲就是你程序里面的线程都卡在RECV这一行了了,但是要解除RECV只有去调前面代码中的SEND,程序已经卡在RECV怎么可能再向前回朔,造成了两个进程之间的死锁。