gpt4 book ai didi

qt - 如何正确使用QDBusPendingCallWatcher?

转载 作者:行者123 更新时间:2023-12-05 05:27:58 26 4
gpt4 key购买 nike

我正在尝试使用 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*)));
    }

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

谢谢!

最佳答案

仔细看看 QDBusPendingCallWatcher documentation :

The slot connected to by the above code could be something similar to the following:

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

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

关于qt - 如何正确使用QDBusPendingCallWatcher?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14726469/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com