Chinaunix首页 | 论坛 | 博客
  • 博客访问: 15185
  • 博文数量: 5
  • 博客积分: 1536
  • 博客等级: 上尉
  • 技术积分: 60
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-18 18:58
文章分类

全部博文(5)

文章存档

2012年(1)

2011年(4)

我的朋友

分类: C/C++

2011-05-15 11:24:18

在创建QWSClient时,系统调用
            QObject::connect(ad, SIGNAL(readyRead()),
                q, SLOT(_q_doClient()));
把QAuthDevice(#ifndef QT_NO_SXE)的readyRead()信号和_q_doClient()函数联系到一块。而QAuthDevice在构造的时候通过
            connect( m_target, SIGNAL(readyRead()),
                this, SIGNAL(readyRead()));
和m_target联系到一块。m_target是相应QWSClient的QWSSocket。QWSSocket的readyRead()信号是通过QUnixSocket从QIODevice继承来的。而该信号是和QUnixSocketPrivate的readyRead()信号在QUnixSocketPrivate构造的时候联系在一起的。
    QObject::connect(this, SIGNAL(readyRead()), me, SIGNAL(readyRead()))
me即是相应的QUnixSocket。在
    void QUnixSocketPrivate::readActivated()
中会产生readyRead()信号。调用readActivated()槽函数的地方有两处,一处是
    bool QUnixSocket::waitForReadyRead(int msecs)
,该函数调用
    int rv = ::select(d->fd + 1, &readset, 0, 0, ptrTv)
查询QUnixSocket的套接字,如果有数据到来,激活readActivated()。调用waitForReadyRead()函数有多处
    void QWSDisplay::Data::flush()
    void QWSDisplay::Data::waitForConnection()
    void QWSDisplay::Data::waitForRegionAck(int winId)
    void QWSDisplay::Data::waitForRegionEvents(int winId, bool ungrabDisplay)
    void QWSDisplay::Data::waitForCreation()
    void QWSDisplay::Data::waitForPropertyReply()
    void QWSDisplay::Data::waitForQCopResponse()
可以看出,这些都是用在一些需要同步通信的场合。
另一处调用readActivated()的地方是
        QObject::connect(d->readNotifier, SIGNAL(activated(int)),
                     d, SLOT(readActivated()));
每一次消息循环都会检测所有的QSocketNotifier,如果该QSocketNotifier有变化,发出activated(int)信号,然后触发相应动作,在这里是readActivated()。
 
在QWSClient构造的时候会调用
    connect(csocket, SIGNAL(readyRead()), this, SIGNAL(readyRead()));
函数,也就是说,QWSSocket的readyRead()会连接两个槽函数。实际上,QWSClient的readyRead()的信号是在(#ifndef QT_NO_SXE)选项不成立的时候才用到的,原理和刚才说的差不多。
阅读(625) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~