免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 977 | 回复: 0
打印 上一主题 下一主题

QT Embedded二三事之QWSClient [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-05-17 18:00 |只看该作者 |倒序浏览

    在前面QWSServer文章中,已经提到QWSClient代表QApplication或QWSDisplay。QWSClient保存了QT Client的部分信息来标识每个QT Client,这些信息保括client appname, clientid。
    QWSClient的主要功能还是负现QWSDiplay与QWSServer的通讯,QWSDisplay将QWSCommand发给QWSClient(QWSClient::readMore), 同时QWSServer的QWSEvent也经由QWSClient发送给QWSDisplay(QWSClient::sendEvent)。
    下面详细阐述一下QWSDisplay与QWSServer的建立联系过程。
    1.QWSDiplay和QWSServer的连接过程
    整个连接过程分为三步:QWSServer建立server socket,QWSDisplay发起连接请求,QWSServer响应请求建立QWSClient。
    (1)QWSServer建立server socket
    先看一下QWSServer的类继承顺序:QWSServer-->QWSServerSocket-->QServerSocket。
    QServerSocket是server socket的一个封装。QWSServerSocket则是将所建立的server socket限制为unix domain socket.
    最后,经过一系列构造过程和系统调用socket,bind,listen,最后调用QServerSocket::setSocket完成过程。
    最终结果是,QWSServer在qws_qtePipeFilename()上listen连接请求,有请求到来时,执行QWSServer::newConnection(int socket )。
    (2)QWSDisplay发起连接请求
    QApplication在构造QWSDiplay过程,发起向QWSServer的连接请求,具体过程如下:
    QApplication::construct-->qt_init-->init_display-->qt_fbdpy = new QWSDisplay()-->new QWSDisplay::Data();
    class QWSDisplay::Data {
    public:
     Data( QObject* parent, bool singleProcess = FALSE )
     {
       .........
           csocket = new QWSSocket(parent);
       .........
       init();
     }
     
     void QWSDisplay::Data::init()
    {
  ......................
     QString pipe = qws_qtePipeFilename();
     sharedRamSize = qwsSharedRamSize;
  #ifndef QT_NO_QWS_MULTIPROCESS
     if ( csocket )    {
  // QWS client
   csocket->connectToLocalFile(pipe);
   ........................
}
    (3)QWSServer响应请求建立QWSClient
    在csocket->connectToLocalFile(pipe)后,QWSServer收入请求后,执行QWSServer::newConnection(int socket )。
    void QWSServer::newConnection( int socket )
{
     client[socket] = new QWSClient(this,socket, get_object_id());
  ............
}
    至此,QWSDiplay就和QWSServer建立了连接,QWSClient也建立起来。
    之后,QWSClient通过QWSClient::readMoreCommand读取QWSDisplay::Data::csocket发来的消息,放入commandQueue中等待QWSServer处理。同时QWSServer利用QWSClient::sendEvent将QWSEvent发送给QWSDisplay。





本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/92787/showart_1931789.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP