通讯可以讨论的地方很多,今天仅就Ice(参考zeroc.com)通讯中间件,以及其与Qt的协作随便说说。
一个程序中同时用到Qt和Ice库,做为server有大概3种方法:
1、使用qapplication,将Ice的Ice::Application.main()放在一个QTread的run函数;
以Qt库为主,但是Ice所在线程没法处理Qt的消息,一般也不需要,对大多数情况足够了,并且没有发现什么运行不正确的地方;
2、不适用Qt::Application,仅使用Qt的QString、QSql、QPlugin等便利的函数;
以Ice库为主,Qt的消息机制无效,如果仅使用Qt的类方便处理,也是个不错的选择;
3、可以将Qt、Ice的消息处理融合起来,需要比较高的技巧;
如果仅是Qt的Gui程序,不需要创建Ice的adapter,也有几种方法:
1、直接在Qt的函数里,proxy->dosth(),遇到超时函数,界面无响应;这种方法简单直接;
2、调用放在线程里,注意如果要刷新GUI,则需要用qApp->postEvent();这也是比较简单的方法;
3、用Ice的异步调用,可以参考Ice的相关文档
由于slice2cpp生成的代码,用的是标准c++库,最常用的类型string、map、vector,每次在调用接口时转来转去相当麻烦,有没有可能直接生成QString、QMap、QVector、QStringList呢?
答案是当然可以,并且用slice2qt生成的代码,和其它python等程序通讯也没有任何问题;
网上有个开源项目就是slice2qt,自从3.2.1后就没更新了
归纳一下其实现步骤:
1、使用或修改Ice的标准slice2cpp项目;
2、生成头文件时,包含QString、QMap、QVector等相应头文件
3、类型为string的输出为QString,同时修改其__read、__write的实现;
4、类型为vector<string>的输出为QStringList;
5、其它类型为vector<T>的输出为QVector,如果用QList,则需要处理,resize()函数;
6、类型为map的输出为QMap
7、为QVector和QMap的新类型,增加operator<()函数;
8、修改其QMap的新类型__read、__write实现。
以上在Ice3.4.2和Qt4.7.4使用,没发现什么问题,Qt+Ice实现的服务,用python调用,正常。