2

我正在尝试使用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使用了共享数据指针,不手动删除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*)));
    }
    

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

谢谢!

4

1 回答 1

1

仔细查看QDBusPendingCallWatcher 文档

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

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 将在执行返回到事件循环后立即删除 Object。

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

于 2013-02-06T12:38:44.203 回答