【问题标题】:Design suggestion needed to convert synchronous qtdbus calls to asynchronous将同步 qtdbus 调用转换为异步所需的设计建议
【发布时间】:2012-06-14 00:54:51
【问题描述】:

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

【问题讨论】:

    标签: qt dbus qtdbus


    【解决方案1】:

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

    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);
    
    }
    

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-25
      • 1970-01-01
      相关资源
      最近更新 更多