首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Qt/DBus适配器中实现异步函数的适当方法

在Qt/DBus适配器中实现异步函数的适当方法
EN

Stack Overflow用户
提问于 2016-08-11 05:13:25
回答 1查看 838关注 0票数 2

正如D总线文档所描述的,所有IPC调用都被认为是异步的.当Qt通过QDBusAbstractInterface,调用远程D-总线对象时,就会出现完全异步的QBusPendingCall,并在调用运行完成时提供信令。

在我的应用程序设计中,我希望在我的对象适配器上实现异步调用,但是当前的Qt/DBus实现假设所有方法调用都是阻塞的。

因此,有一个问题:是否有正确的方法来实现异步处理D总线方法调用?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-25 12:58:30

这一点在在D-Bus适配器中声明插槽中解释得很好。

为此,我们编写了一个将请求数据存储在持久结构中的槽,并向使用QDBusMessage::setDelayedReply(true)的调用方指示稍后将发送响应。

代码语言:javascript
运行
复制
struct RequestData
{
    QString request;
    QString processedData;
    QDBusMessage reply;
};

QString processRequest(const QString &request, const QDBusMessage &message)
{
    RequestData *data = new RequestData;
    data->request = request;
    message.setDelayedReply(true);
    data->reply = message.createReply();
    QDBusConnection::sessionBus().send(data->reply);

    appendRequest(data);
    return QString();
}

需要使用QDBusConnection::sessionBus().send(data->reply)显式地通知调用方响应将被延迟。在这种情况下,返回值并不重要;我们返回一个任意值以满足编译器的要求。

当请求被处理并且应答可用时,应该使用获得的QDBusMessage对象发送它。在我们的示例中,应答代码可以如下所示:

代码语言:javascript
运行
复制
void sendReply(RequestData *data)
{
    // data->processedData has been initialized with the request's reply
    QDBusMessage &reply = &data->reply;

    // send the reply over D-Bus:
    reply << data->processedData;
    QDBusConnection::sessionBus().send(reply);

    // dispose of the transaction data
    delete data;
}

在这个例子中可以看到,当一个延迟的回复到位时,Qt总线将忽略来自时隙的返回值。当将适配器的描述传递给远程应用程序时,它们仅用于确定插槽的签名,或者在插槽中的代码决定不使用延迟答复时使用。

延迟回复本身是通过调用原始消息上的QDBusMessage::reply()从Qt请求的。然后,被调用的代码负责最终向调用方发送回复。

警告:当调用方发出方法调用并等待回复时,它只会等待有限的时间。需要很长时间才能完成的插槽应该在文档中清楚地说明这一点,以便调用方能够正确设置更高的超时时间。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38887721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档