将同步qtdbus调用转换为异步所需的设计建议

时间:2012-06-11 05:02:18

标签: qt dbus qtdbus

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

1 个答案:

答案 0 :(得分: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()。这样它在技术上仍然是异步调用,但它是同步的。