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

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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()。这样,它在技术上仍然是一个异步调用,但它是同步的。

【讨论】:

以上是关于将同步 qtdbus 调用转换为异步所需的设计建议的主要内容,如果未能解决你的问题,请参考以下文章

如何查询/将数据转换为所需的格式

将数据帧转换为所需的字典格式

将表格布局转换为 Div

将给定数字转换为幸运数字所需的最小移动次数[关闭]

编程:将二进制数转换为零所需的最少步骤

如何将 python 字典转换为所需的格式