如何正确使用QDBusPendingCallWatcher?

时间:2013-02-06 10:15:03

标签: qt qtdbus

我正在尝试使用QDBusPendingCallWatcher来观看异步调用。一些示例代码如下:

{
    // interface = new QDBusInterface(...);
    QDBusPendingCall pcall = interface->asyncCall("query");
    QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(pcall, this);
    QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(handler(QDBusPendingCallWatcher*)));
}

和处理函数:

void Client::handler(QDBusPendingCallWatcher* call)
{       
    QDBusPendingReply<QString> reply = *call; 
    // do something
}

我的问题是:

  1. 看起来QDBusPendingCallWatcher使用shared data pointer inside,不手动删除watcher指针是否安全?只是离开范围而忘记它?

  2. 如果我可以让pendingcall的智能指针执行所有操作,我可以在班级中只使用一个QDBusPendingCallWatcher指针来观看所有异步调用吗?像这样:

    {
        QDBusPendingCall pcall = interface->asyncCall("query");
        watcher = new QDBusPendingCallWatcher(pcall, this);
        QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(handleOne(QDBusPendingCallWatcher*)));
    
        pcall = interface->asyncCall("anotherQuery");
        watcher = new QDBusPendingCallWatcher(pcall, this);
        QObject::connect(watcher, SIGNAL(finished(QDBusPendingCallWatcher*)), this, SLOT(handleTwo(QDBusPendingCallWatcher*)));
    }
    

    这会造成灾难吗?或者我应该为每次通话使用多个指针吗?

  3. 谢谢!

1 个答案:

答案 0 :(得分:1)

仔细查看QDBusPendingCallWatcher documentation

  

上述代码连接的插槽可能类似于以下内容:

void MyClass::callFinishedSlot(QDBusPendingCallWatcher *call)
{
    QDBusPendingReply<QString, QByteArray> reply = *call;
    if (reply.isError()) {
        showError();
    } else {
        QString text = reply.argumentAt<0>();
        QByteArray data = reply.argumentAt<1>();
        showReply(text, data);
    }
    call->deleteLater();
}

QObject::deleteLater的调用是关键:这意味着只要执行返回到事件循环,Qt就会删除对象。

只要您在deleteLater内拨打Client::handler(...),您就不需要 - 更确切地说,您不需要 - 在任何地方拨打delete watcher;。您唯一需要确保的是,在插槽返回后,没有人使用call后面的对象。