基于对话框的程序和CAsyncSocket的两个原理性有关问题
基于对话框的程序和CAsyncSocket的两个原理性问题!
1.我看了别人vc写的一个五子棋程序(未用到线程),调试运行的时候点两次执行即有两个五子棋对话
框弹出,然后就可以用两个对话框开始下棋。那么第二个对话框是不是又把程序重新执行了一遍呢?(F5调试的时候只有第一
个对话框会执行到断点),调试中我发现,对于程序中的变量,这两个对话框是各自保存一份,也就是A对话框如果改变一个变
量的值B对话框的该变量值并没有改变,这里面包含哪些知识呢? 两个对话框是不是两个线程呢
2.在使用CAsyncSocket套接字的时候,我想这样做:在一个对话框中设置两个按钮A,B。点击A按钮时建立一个服务器套接字,然
后Listen,点击B按钮时建立客户端套接字,然后Connect(我已经派生了CAsyncSocket类,并重写了OnAccept),结果是无法
连接成功。但是如果我换一种方法:对话框中只设置一个按钮"connect",运行两次程序,弹出两个对话框,通过程序控制当点
第一个对话框的connect按钮时建立服务器套接字然后Listen,点第二个对话框的connect按钮时建立客户端套接字然后Connect
这样就连接成功,不知道为什么第一种方法不行呢?
------解决方案--------------------
这是进程通信啊!非线程...
你的第一种方法可以的,可能是 你哪里出了问题吧...
我估计是你A、B2个按钮事件出了问题!
你的第二种方法没看,自己慢慢琢磨!
------解决方案--------------------
两边最好是同步一份数据,这样编程比较容易。
或者采用主机+客户机的模式,不过这样也是要主机发送数据去客户的,,,
------解决方案--------------------
1.我没记错的话,每次只能调试一个程序吧。
像你这样调用的,那就是每个对话框都有一个主线程的。
2.这个很少用,看到网上的一段话“在你使用CAsyncSocket之前,必须调用AfxSocketInit初始化WinSock环境,而AfxSocketInit会创建一个隐藏的CSocketWnd对象,由于这个对象由Cwnd派生,因此它能够接收Windows消息。一方面它会接受各个CAsyncSocket的状态报告,另一方面它能捕捉系统发出的各种SOCKET事件。所以它能够成为高层CAsyncSocket对象与WinSock底层之间的桥梁:例如某CAsyncSocket在Send时WSAEWOULDBLOCK了,它就会发送一条消息给CSocketWnd作为报告,CSocketWnd会维护一个报告登记表,当它收到底层WinSock发出的空闲消息时,就会检索报告登记表,然后直接调用报告者的OnSend函数。所以前文所说的CAsyncSocket会自动调用OnXxx,实际上是不对的,真正的调用者是CSocketWnd——它是一个CWnd对象,运行在独立的线程中。”
所以会不是会那个窗口被占用了
------解决方案--------------------
进程通信有很多种方法,有内存共享可以通信,它就是利用资源共享完成进程通信的!
而你用的CAsyncSocket不是那个意思(以我的理解)。
其实简单的说你的A/B2个对话框要建立连接。就是A/B要同一个(这是比如其实不是管道)管道一样的2个连接了,
我发消息你能知道,你发消息我也能知道!就是这样的! 纯属我个人理解!~~不对请原谅.
------解决方案--------------------
问题一有很种方法吧:
(1)VC中进程间共享内存实现
http://blog.sina.com.cn/s/blog_5f93da790100okik.html
(2)VC 利用DLL共享区间在进程间共享数据及进程间广播消息
http://www.cnblogs.com/morewindows/archive/2011/08/19/2145799.html
(3)每个一程序入口的WinMain函数都有四个参数,其中之一好像是叫hPreHinstance,它是记录前一个进程的句柄,通过它可以找到前一个进程中的变量.
(4)通过MFC的THREAD_MODULE_STATE等宏及其相关函数可能能够实现你的需求.
第二个问题:理论上应该是可以的吧,是不是你哪里搞错了,比如套接字的状态判断有问题或者端口设置不对?
1.我看了别人vc写的一个五子棋程序(未用到线程),调试运行的时候点两次执行即有两个五子棋对话
框弹出,然后就可以用两个对话框开始下棋。那么第二个对话框是不是又把程序重新执行了一遍呢?(F5调试的时候只有第一
个对话框会执行到断点),调试中我发现,对于程序中的变量,这两个对话框是各自保存一份,也就是A对话框如果改变一个变
量的值B对话框的该变量值并没有改变,这里面包含哪些知识呢? 两个对话框是不是两个线程呢
2.在使用CAsyncSocket套接字的时候,我想这样做:在一个对话框中设置两个按钮A,B。点击A按钮时建立一个服务器套接字,然
后Listen,点击B按钮时建立客户端套接字,然后Connect(我已经派生了CAsyncSocket类,并重写了OnAccept),结果是无法
连接成功。但是如果我换一种方法:对话框中只设置一个按钮"connect",运行两次程序,弹出两个对话框,通过程序控制当点
第一个对话框的connect按钮时建立服务器套接字然后Listen,点第二个对话框的connect按钮时建立客户端套接字然后Connect
这样就连接成功,不知道为什么第一种方法不行呢?
------解决方案--------------------
这是进程通信啊!非线程...
你的第一种方法可以的,可能是 你哪里出了问题吧...
我估计是你A、B2个按钮事件出了问题!
你的第二种方法没看,自己慢慢琢磨!
------解决方案--------------------
两边最好是同步一份数据,这样编程比较容易。
或者采用主机+客户机的模式,不过这样也是要主机发送数据去客户的,,,
------解决方案--------------------
1.我没记错的话,每次只能调试一个程序吧。
像你这样调用的,那就是每个对话框都有一个主线程的。
2.这个很少用,看到网上的一段话“在你使用CAsyncSocket之前,必须调用AfxSocketInit初始化WinSock环境,而AfxSocketInit会创建一个隐藏的CSocketWnd对象,由于这个对象由Cwnd派生,因此它能够接收Windows消息。一方面它会接受各个CAsyncSocket的状态报告,另一方面它能捕捉系统发出的各种SOCKET事件。所以它能够成为高层CAsyncSocket对象与WinSock底层之间的桥梁:例如某CAsyncSocket在Send时WSAEWOULDBLOCK了,它就会发送一条消息给CSocketWnd作为报告,CSocketWnd会维护一个报告登记表,当它收到底层WinSock发出的空闲消息时,就会检索报告登记表,然后直接调用报告者的OnSend函数。所以前文所说的CAsyncSocket会自动调用OnXxx,实际上是不对的,真正的调用者是CSocketWnd——它是一个CWnd对象,运行在独立的线程中。”
所以会不是会那个窗口被占用了
------解决方案--------------------
进程通信有很多种方法,有内存共享可以通信,它就是利用资源共享完成进程通信的!
而你用的CAsyncSocket不是那个意思(以我的理解)。
其实简单的说你的A/B2个对话框要建立连接。就是A/B要同一个(这是比如其实不是管道)管道一样的2个连接了,
我发消息你能知道,你发消息我也能知道!就是这样的! 纯属我个人理解!~~不对请原谅.
------解决方案--------------------
问题一有很种方法吧:
(1)VC中进程间共享内存实现
http://blog.sina.com.cn/s/blog_5f93da790100okik.html
(2)VC 利用DLL共享区间在进程间共享数据及进程间广播消息
http://www.cnblogs.com/morewindows/archive/2011/08/19/2145799.html
(3)每个一程序入口的WinMain函数都有四个参数,其中之一好像是叫hPreHinstance,它是记录前一个进程的句柄,通过它可以找到前一个进程中的变量.
(4)通过MFC的THREAD_MODULE_STATE等宏及其相关函数可能能够实现你的需求.
第二个问题:理论上应该是可以的吧,是不是你哪里搞错了,比如套接字的状态判断有问题或者端口设置不对?