MapGuide启动过程

         为了理清顺序,我会按步来展开:

  1.静态变量初始化(只说有输出的位置).

  编译好MapGuide开源版,debug运行,在main函数入口打上断点,会发现一堆 "FT_Stream_Open"输出.这是因为静态变量的缘故,优先于mian函数初始化.好了,现在我们揪出他的位置. 在项目中搜索,发现是 在mapguide\Common\Renderers\FontManager.cpp中. 是FontManager中的两个静态成员:    

   CustomThreadMutex FontManager::sm_mutex; // 锁,CustomThreadMutex类,在windowszz上是封装的关键段CRITICAL_SECTION,非Win是pthread_mutex_t 
   FontManager FontManager::sm_manager;   //  字体管理类 

sm_manager在构造函数中会初始化FreeType: FT_Init_FreeType(&m_library);然后sm_manager.init_font_list()初始化字体(按理说sm_manager还没有初始化完,只是操作的list已经初始化了). 通过SHGetFolderPath得到系统字体目录,然后遍历该目录下的字体文件,加载到m_fontlist中保存.然后把Arial字体移动到 m_fontlist的最前面.至此,静态变量初始化结束.

      2.main函数初始化一些库,ACE, Xerces.创建ACE_Singleton<MgServer, ACE_SYNCH_MUTEX> 的实例,也就是 MgServer类.

      3.main函数解析命令行参数.mapguide可以以服务方式和应用程序方式启动.

      4.MgServer init()以及open(), open是个很重要的操作.

      open()首先加载创建 MgConfiguration, 然后用其去加载mapguide 的服务器配置文件serverconfig.ini.  MgConfiguration 主要的成员 MgConfigurationHeap,而 MgConfigurationHeap是ACE_Configuration_Heap 的封装,故配置这部分是通过 ACE实现的.配置文件中[XXX]为一个Section, XXX=XXX为propertyName和value. 通过Section生成的key来识别.加载完配置文件后就可以拿到一些信息了,例如日志存放的路径.可以初始化日志管理类MgLogManager, 资源类MgResources,  坐标信息类 MgCoordinateSystemFactory, MgLicenseManager是商业版的吧,也出现在开源版中了~ 然后初始化了MgServerManager, MgLoadBalanceManager, MgServiceManager, FDO(动态加载dll),MgCoordinateSystemFactory.最后通过svc()启动操作线程.

       5.ACE reactor. Mapguide初始化完所有资源以后, 通过svc(),主线程进入run_reactor_event_loop, 众多子线程进入MgOperationThread::svc(),即ACE_Task method.

      至此,mapguide启动完成~

   

posted @ 2012-12-01 01:50  烟影  阅读(367)  评论(0编辑  收藏  举报