我正在尝试使用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
}
我的问题是:
看起来QDBusPendingCallWatcher
使用shared data pointer inside,不手动删除watcher
指针是否安全?只是离开范围而忘记它?
如果我可以让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*)));
}
这会造成灾难吗?或者我应该为每次通话使用多个指针吗?
谢谢!
答案 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
后面的对象。