Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在Qt/DBus适配器中实现异步功能的正确方法_C++_Qt_C++11_Asynchronous_Qdbus - Fatal编程技术网

C++ 在Qt/DBus适配器中实现异步功能的正确方法

C++ 在Qt/DBus适配器中实现异步功能的正确方法,c++,qt,c++11,asynchronous,qdbus,C++,Qt,C++11,Asynchronous,Qdbus,如D-Bus文档中所述,所有IPC调用都被认为是异步的。当Qt通过QDBusAbstractInterface调用远程D-Bus对象时,有一个完全异步的QBusPendingCall,当调用运行到完成时提供信号 在我的应用程序设计中,我想在我的对象适配器上实现异步调用,但当前的Qt/DBus实现假设所有方法调用都是阻塞的 所以,有一个问题:有没有合适的方法来实现异步处理D-Bus方法调用?这在中得到了很好的解释 为此,我们编写了一个以持久结构存储请求数据的插槽,使用QDBusMessage::s

如D-Bus文档中所述,所有IPC调用都被认为是异步的。当Qt通过QDBusAbstractInterface调用远程D-Bus对象时,有一个完全异步的QBusPendingCall,当调用运行到完成时提供信号

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


所以,有一个问题:有没有合适的方法来实现异步处理D-Bus方法调用?

这在中得到了很好的解释

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

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
对象发送请求。在我们的示例中,回复代码可以如下所示:

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;
}
void sendReply(RequestData*data)
{
//data->processedData已使用请求的答复初始化
QDBusMessage&reply=&data->reply;
//通过D-Bus发送回复:
回复处理数据;
QDBusConnection::sessionBus().send(reply);
//处理事务数据
删除数据;
}
从示例中可以看出,当延迟回复到位时,Qt D-Bus将忽略插槽的返回值。它们仅用于在向远程应用程序传输适配器的描述时,或者在插槽中的代码决定不使用延迟回复时,确定插槽的签名

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


警告:当调用方进行方法调用并等待答复时,它将只等待有限的时间。要花很长时间才能完成的插槽应在文档中明确说明这一事实,以便呼叫者正确设置更高的超时。

如果您展示了一个实际阻塞方法的示例,则此问题更有可能得到答案。现在至少对我来说有点不清楚(我还没有使用dbus,真的)。虽然这可以从理论上回答这个问题,但在这里包括答案的基本部分,并提供链接供参考。