将同步 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 调用转换为异步所需的设计建议的主要内容,如果未能解决你的问题,请参考以下文章