本人初学ACE(ACE是什么在这里就不介绍了,感兴趣的朋友要自己看一下了),在编译和使用中遇到了些问题,经过努力和其他朋友的帮忙,基本上都能解决,下面就把这些问题及其解决方法总结一下,供大家交流。接下来的实践中可能还会有问题,我会继续贴到这里,请大家批评指正。
说明一下,本人的编程环境是XP+VS2005。ACE是从官方网站上下载的新版本(2006.8)。
1.如果在用ACE的Reactor框架写网络服务端程序,编译时遇到下面这样的错误:“undefined class 'ACE_Null_Mutex'”就把#include "ace/Synch.h"加在你的头文件中。其实在编译ACE程序中经常会出现这种情况,可以根据实际问题找一找应该加载哪个头文件。
2.在编写网络程序(socks)时,还是要进行初始化,就是要用WSAStartup()API来装入ws2_32.dll这个库,如果没有初始化,使用socks函数时就会出现未初始化的错误提示信息。但是在用Reactor和Event_handle来编写程序时就不用初化,具体什么原因还不太清楚。
3.如果继承ACE_TASK_BASE类来建立线程,最好声明对象指针,以->activate()的格式来启动线程,否则有可能在运行过程中出现错误,因为线程主服务函数svc()是虚函数,直接用对象.activate()的格式调用就用不到它的动态性,所以在运行中可能就会出现错误。
4.如果在编写WINDOWS窗口程序时,使用TASK建立线程,可能会遇到这样的问题:编译和连接都没什么问题,但程序在运行时就会挂起。通过分析和试验,我发现在CONSOLE程序下,就没问题。如果在窗口(GUI)下要使用TASK对象,程序就要以main作为入口点。具体原因没有进行深入分析,请高手指教其中的原理。
具体做法:首先,要把WinMain()函数去掉,改为int main(int char* argv[])。如果窗口程序中要用到程序的实例句柄(hInstance),可以用GetModuleHandle()API来取得。其次,要在项目的“连接”属性处的“高级”上,修改程序入口点标号为main才可以连接成功。
ACE框架复用的一些小问题
最新推荐文章于 2023-08-28 10:09:06 发布