1

到目前为止,我项目中的应用程序使用同步调用通过 qtdbus 进行通信。但是,我现在需要将其中一些调用转换为异步调用。为此,我选择使用 qtdbus QDBusAbstractInterface::callWithCallback 中提供的这个 API 但问题是当前的实现有这些 qtdbus 同步调用分散在代码中的很多地方,并且遵循这些同步调用的代码片段假定控制只有当前面的呼叫已成功服务并获得回复时才会到达他们。当调用更改为异步时,情况将不再如此。此外,调用是在不同的上下文中进行的,所以我需要在每次调用 qtdbus 之前维护系统的状态,以便在收到回复时知道该怎么做。真的有机会以某种方式将调用转换为异步,而不会大幅破坏当前代码的结构吗?我能想到的一种方法是使用 FSM 模式。任何提示或设计建议将不胜感激。谢谢!

4

1 回答 1

0

我理解的方式是,您将需要调用相同的方法,然后根据调用时的状态以不同的方式处理返回值。如

void function()
{
    //do stuff
    value = SynchronousCall();
    if (state == 1)
    {
        doSomething(value);
    }
    else
    {
        doSomethingElse(value);
    }
}

我建议不要完全实现有限状态机模式,因为它会弄乱它添加的类的数量,而是为每个状态添加单独的方法

void function()
{
    //do stuff
    if (state == 1)
    {
        callback = *doSomething(ValueType);
    }
    else
    {
        callback = *doSomethingElse(ValueType);
    }
    callWithCallback(method,args, receiver,callback,error);

}

然后在每种方法中,您可以假设状态并​​相应地处理返回值。

另一种稍微(非常)hacky的方法是在所有异步调用之后简单地进行旋转等待,并QThread:: yield()在等待值返回时在循环中使用a。这样,它在技术上仍然是一个异步调用,但它是同步的。

于 2012-06-13T18:00:26.280 回答