首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将同步qtdbus调用转换为异步调用所需的设计建议

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

Stack Overflow用户
提问于 2012-06-11 13:02:18
回答 1查看 570关注 0票数 1

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-06-14 02:00:26

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

代码语言:javascript
复制
void function()
{
    //do stuff
    value = SynchronousCall();
    if (state == 1)
    {
        doSomething(value);
    }
    else
    {
        doSomethingElse(value);
    }
}

我建议为每个状态添加单独的方法,而不是完整地实现有限状态机模式,因为有限状态机模式可能会使它添加的类数量变得混乱

代码语言:javascript
复制
void function()
{
    //do stuff
    if (state == 1)
    {
        callback = *doSomething(ValueType);
    }
    else
    {
        callback = *doSomethingElse(ValueType);
    }
    callWithCallback(method,args, receiver,callback,error);

}

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10974683

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档